新規事業計画のAI分析＆自動生成

# 0.初めに

事業再構築補助金ってご存知ですか？
![スクリーンショット 2024-12-08 14.02.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637236/26784a58-5b68-8b32-ae68-426d7999a0f8.png)

最大1億円という高額な補助金額ということもあって、その界隈ではとても話題になっていましたが、怪しげな事業計画が採択されていたことが問題視され、残念ながら第12回で打ち止めの気配です。
事業再構築というのは新規事業開発そのものであり、その計画をどうやって組み上げていけば良いのか？という虎の巻を経済産業省が公開していました。（こちらも残念ながら、現在非公開となっているようです。とても残念です）
![スクリーンショット 2024-12-08 14.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637236/564e9b1d-06be-c297-8d89-a0f1f0c710fd.png)

この虎の巻が、非常に良くできていて、特に「数万件の事業計画書データを AI で分析して示唆を得た」としているところが、とても説得力があります。
![スクリーンショット 2024-12-08 14.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637236/66b809ea-6f67-6d73-ffcb-56cfd5abe361.png)

で、これってどうやったの？という妄想がこの投稿です。
また、数万件のビッグデータから得た示唆で、新規事業計画書作成の虎の巻ができたということは、逆算アプローチで、”やり方”を起点にして、自社の内部環境情報や市場動向など外部環境情報をインプットとすることで、新規事業計画が自動作成できるでしょ、という試みを行います。



## 1.ビッグデータからの示唆の得方

多分、このような手順で抽出したのだと思います。
### AIを活用したビッグデータ分析
1.データソース: 数万件の事業再構築補助金への申請データ
2.分析手法:
- 自然言語処理・機械学習を用いたAIアルゴリズム
- AIによる事業内容の解釈・分類

3.分析目的:
  - 有望な事業計画書に共通して含まれるトピックの特定
  - 統計上有望な再構築の事業テーマの特定

4.分析結果:
  - 13個の重要トピックの抽出
  - 事業テーマの有望度分類（高・中・低）

 分析から得られた示唆
   - 重要トピックの具体化:
     - 事業再構築の方針決定
     - 新製品/サービスと実現する強み
     - 目標設定と投資対効果の検証
     - 実行可能な計画の策定
   - 事業テーマの有望度評価:
     - 申請数と採択率の組み合わせによる分類
     - 市場成長性と参入障壁の考慮
   - 社会課題解決への貢献:
     - 先端的なデジタル技術（AI/IoT等）の活用
     - SDGsや具体的な社会課題への取り組み


分析手法について、もう少し具体化します。


1.データ前処理
 - テキストクリーニング: 事業計画書のテキストデータからノイズを除去し、一貫した形式に整形する。
 - トークン化: テキストを単語や句に分割する。
 - ストップワード除去: "の"、"です"などの一般的な単語を除去する。
 - 正規化: 単語の異なる表記を統一する（例: "会社"と"企業"）。

2.トピック特定
 - TF-IDFベクトル化: 各文書の重要な単語を数値化する。
 - トピックモデリング: Latent Dirichlet Allocation (LDA)を使用して、文書集合から潜在的なトピックを抽出する。
 - トピッククラスタリング: k-meansなどのアルゴリズムを用いて、類似したトピックをグループ化し、13個の重要トピックを特定する。
 
3.事業テーマの有望度分類
 - 特徴抽出: 各事業計画書から、業種、事業内容、財務指標などの特徴を抽出する。
 - ラベル付け: 採択された事業計画書に"採択"ラベルを付与する。
 - 機械学習モデルの構築: ランダムフォレストやXGBoostなどのアルゴリズムを使用して、採択予測モデルを構築する。
 - 重要度分析: モデルの特徴量重要度を分析し、採択に影響を与える要因を特定する。
 - クラスタリング: 事業テーマを特徴量空間でクラスタリングし、採択率と申請数に基づいて高・中・低の有望度に分類する。
 
4.結果の検証と解釈
 - クロスバリデーション: モデルの性能を検証し、過学習を防ぐ。
 - 専門家レビュー: 分析結果を事業再構築の専門家が確認し、実務的な観点から妥当性を評価する。
 - 可視化: トピックや事業テーマの分布を2次元または3次元で可視化し、直感的な理解を促進する。

この手法により、大量の事業計画書データから有意義な洞察を抽出し、事業再構築の成功要因を特定できそうです。

パイソンコードで書くと以下のような感じです。


```
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.cluster import KMeans
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# データの読み込み
def load_data(file_path):
    return pd.read_csv(file_path)

# テキストの前処理
def preprocess_text(text):
    # ここでテキストクリーニング、トークン化、ストップワード除去などを行う
    return processed_text

# TF-IDFベクトル化
def tfidf_vectorize(texts):
    vectorizer = TfidfVectorizer(max_features=5000)
    return vectorizer.fit_transform(texts)

# トピックモデリング
def topic_modeling(tfidf_matrix, n_topics=13):
    lda = LatentDirichletAllocation(n_components=n_topics, random_state=42)
    return lda.fit_transform(tfidf_matrix)

# クラスタリング
def clustering(feature_matrix, n_clusters=3):
    kmeans = KMeans(n_clusters=n_clusters, random_state=42)
    return kmeans.fit_predict(feature_matrix)

# 採択予測モデルの構築
def build_prediction_model(X, y):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    model = RandomForestClassifier(random_state=42)
    model.fit(X_train, y_train)
    return model, model.score(X_test, y_test)

# 主要な分析プロセス
def main():
    # データ読み込み
    data = load_data('business_plans.csv')
    
    # テキスト前処理
    data['processed_text'] = data['plan_text'].apply(preprocess_text)
    
    # TF-IDF変換
    tfidf_matrix = tfidf_vectorize(data['processed_text'])
    
    # トピックモデリング
    topic_matrix = topic_modeling(tfidf_matrix)
    
    # クラスタリング
    clusters = clustering(topic_matrix)
    
    # 特徴量の作成
    features = np.hstack([tfidf_matrix.toarray(), topic_matrix, clusters.reshape(-1, 1)])
    
    # 採択予測モデルの構築
    model, accuracy = build_prediction_model(features, data['is_adopted'])
    
    # 重要な特徴量の抽出
    feature_importance = model.feature_importances_
    
    # 結果の表示
    print(f"モデルの精度: {accuracy}")
    print("重要なトピック:")
    for i, importance in enumerate(feature_importance):
        if importance > 0.01:  # 重要度が1%以上の特徴量を表示
            print(f"トピック {i}: 重要度 {importance}")
    
    # 事業テーマの有望度分類
    data['predicted_probability'] = model.predict_proba(features)[:, 1]
    data['theme_potential'] = pd.cut(data['predicted_probability'], 
                                     bins=[0, 0.33, 0.66, 1], 
                                     labels=['低', '中', '高'])
    
    print("\n事業テーマの有望度分布:")
    print(data['theme_potential'].value_counts(normalize=True))

if __name__ == "__main__":
    main()
```





# 2.”やり方”からの新規事業計画自動作成


事業計画書のビッグデータから傾向を導出して、虎の巻が提示されました。そこで、真逆のアプローチとして、事業計画書作成の虎の巻が、どのように事業計画書を作成するべきかの虎の巻（やり方・書き方・留意点）がチェーンオブソートで書かれている推論モデルであると捉えて、その虎の巻と自社の内部環境（理念・強み・弱み）と、外部環境（競合・顧客・市場動向などをWEB検索エージェントで調査したり、市場の声を仮想ペルソナにヒアリングした結果）をインプットとして、新規事業計画を自動作成するAIエージェントプログラムができそうです。

ワークフローは、
```
自社の理念
　　↓
内部環境分析
　　↓
外部環境分析
　　↓
SWOT分析により全体戦略策定
　　↓
バリューチェーンの機能別戦略（営業・マーケティング戦略、生産・オペレーション戦略、財務・会計戦略、人材戦略　など）策定
　　↓
バリューチェーン別課題特定と解決策アクションプラン策定
　　↓
虎の巻に従って、新規事業計画書としてまとめる
```

という順番です。大体、以下のような実装で実現できそうです。

```
各エージェントの役割とステートの項目

InternalEnvironmentAgent:

役割: 内部環境情報を取得する。
ステート: internal_environment
ExternalEnvironmentAgent:

役割: 外部環境情報を収集する。
ステート: external_environment
MarketVoiceAgent:

役割: 市場の声を収集する。
ステート: market_voices
OpportunityThreatExtractionAgent:

役割: 外部環境情報から機会と脅威を抽出する。
ステート: opportunities, threats
SWOTAnalysisAgent:

役割: SWOT分析を行う。
ステート: swot_analysis
StrategyDevelopmentAgent:

役割: 全体戦略と機能別戦略を策定する。
ステート: overall_strategy, functional_strategies
ActionPlanAgent:

役割: アクションプランを作成する。
ステート: action_plan
BusinessPlanAgent:

役割: 事業計画書を生成する。
ステート: business_plan
共有メモリ情報

company_info
tiger_scroll
internal_environment
external_environment
market_voices
opportunities
threats
swot_analysis
overall_strategy
functional_strategies
action_plan
business_plan
```
このコードを実行することで、各エージェントが順次実行され、最終的に事業計画書が生成されます。各エージェントは、必要な情報をステートから取得し、結果をステートに保存します。


```
import openai

import json

import requests

from langchain import LangGraph, Agent, Memory

from typing import TypedDict, List, Dict



# OpenAI APIキーを設定

openai.api_key = 'your_openai_api_key'



# 共有メモリ情報

shared_memory = Memory()



# 会社情報

company_info = {

    "会社名": "株式会社AI革新",

    "業種": "ITサービス",

    "従業員数": 50,

    "年間売上": "5億円",

    "強み": "AIと機械学習の技術力",

    "弱み": "営業力不足",

    "再構築の方向性": "AI技術を活用した製造業向けの予知保全サービス"

}



# 虎の巻セクション

tiger_scroll = {

    "方針決定": "...",

    "強み分析": "...",

    "目標設定": "...",

    "計画策定": "..."

}



# 内部環境

internal_environment = {

    "理念": "持続可能な社会の実現に貢献する",

    "強み": ["環境技術", "顧客ネットワーク"],

    "弱み": ["資金力", "ブランド認知度"],

    "target_market": "環境意識の高い30代〜40代の消費者"

}



# メモリに初期データを設定

shared_memory.set("company_info", company_info)

shared_memory.set("tiger_scroll", tiger_scroll)

shared_memory.set("internal_environment", internal_environment)



# ステートの定義

class State(TypedDict):

    company_info: Dict

    tiger_scroll: Dict

    internal_environment: Dict

    external_environment: str

    market_voices: List[str]

    swot_analysis: Dict

    overall_strategy: str

    functional_strategies: Dict

    action_plan: Dict

    business_plan: str



# 各エージェントの定義

class InternalEnvironmentAgent(Agent):

    def run(self, state: State):

        internal_environment = state["internal_environment"]

        return internal_environment



class ExternalEnvironmentAgent(Agent):

    def run(self, state: State):

        query = "市場動向 競合分析 顧客ニーズ"

        # Web検索を行う

        response = requests.get(f"https://api.example.com/search?q={query}")

        if response.status_code == 200:

            external_environment = response.json()

        else:

            external_environment = "外部環境情報の取得に失敗しました。"

        state["external_environment"] = external_environment

        return external_environment



class MarketVoiceAgent(Agent):

    def run(self, state: State):

        target_market = state["internal_environment"]["target_market"]

        prompt = f"あなたは{target_market}の顧客です。新しい製品やサービスについて意見を述べてください。"

        response = openai.ChatCompletion.create(

            model="gpt-4o",

            messages=[

                {"role": "system", "content": "You are an excellent Business Plan consultant."},

                {"role": "user", "content": prompt}

            ],

            max_tokens=200,

            n=5,

            stop=None,

            temperature=0.7,

        )

        market_voices = [choice['message']['content'].strip() for choice in response['choices']]

        state["market_voices"] = market_voices

        return market_voices



class OpportunityThreatExtractionAgent(Agent):

    def run(self, state: State):

        external_environment = state["external_environment"]

        prompt = f"以下の外部環境情報から、機会と脅威を抽出してください。\n\n外部環境情報:\n{external_environment}"

        response = openai.ChatCompletion.create(

            model="gpt-4o",

            messages=[

                {"role": "system", "content": "You are an excellent Business Plan consultant."},

                {"role": "user", "content": prompt}

            ],

            max_tokens=2048,

            n=1,

            stop=None,

            temperature=0.7,

        )

        result = response['choices'][0]['message']['content'].strip()

        opportunities, threats = result.split("脅威:")

        opportunities = opportunities.replace("機会:", "").strip().split("\n")

        threats = threats.strip().split("\n")

        

        state["opportunities"] = opportunities

        state["threats"] = threats

        return opportunities, threats



class SWOTAnalysisAgent(Agent):

    def run(self, state: State):

        internal_environment = state["internal_environment"]

        opportunities = state["opportunities"]

        threats = state["threats"]

        

        prompt = f"""

        以下の内部環境情報と機会、脅威を基に、SWOT分析を行ってください。

        

        内部環境情報:

        {json.dumps(internal_environment, ensure_ascii=False, indent=2)}

        

        機会:

        {json.dumps(opportunities, ensure_ascii=False, indent=2)}

        

        脅威:

        {json.dumps(threats, ensure_ascii=False, indent=2)}

        """

        

        response = openai.ChatCompletion.create(

            model="gpt-4o",

            messages=[

                {"role": "system", "content": "You are an excellent Business Plan consultant."},

                {"role": "user", "content": prompt}

            ],

            max_tokens=2048,

            n=1,

            stop=None,

            temperature=0.7,

        )

        

        swot_analysis = json.loads(response['choices'][0]['message']['content'].strip())

        state["swot_analysis"] = swot_analysis

        return swot_analysis



class StrategyDevelopmentAgent(Agent):

    def run(self, state: State):

        swot_analysis = state["swot_analysis"]

        

        prompt = f"""

        以下のSWOT分析結果を基に、全体戦略と機能別戦略を策定してください。

        

        SWOT分析結果:

        {json.dumps(swot_analysis, ensure_ascii=False, indent=2)}

        """

        

        response = openai.ChatCompletion.create(

            model="gpt-4o",

            messages=[

                {"role": "system", "content": "You are an excellent Business Plan consultant."},

                {"role": "user", "content": prompt}

            ],

            max_tokens=2048,

            n=1,

            stop=None,

            temperature=0.7,

        )

        

        result = json.loads(response['choices'][0]['message']['content'].strip())

        overall_strategy = result["overall_strategy"]

        functional_strategies = result["functional_strategies"]

        

        state["overall_strategy"] = overall_strategy

        state["functional_strategies"] = functional_strategies

        return overall_strategy, functional_strategies



class ActionPlanAgent(Agent):

    def run(self, state: State):

        functional_strategies = state["functional_strategies"]

        

        prompt = f"""

        以下の機能別戦略を基に、課題と解決策を特定し、アクションプランを作成してください。

        

        機能別戦略:

        {json.dumps(functional_strategies, ensure_ascii=False, indent=2)}

        """

        

        response = openai.ChatCompletion.create(

            model="gpt-4o",

            messages=[

                {"role": "system", "content": "You are an excellent Business Plan consultant."},

                {"role": "user", "content": prompt}

            ],

            max_tokens=2048,

            n=1,

            stop=None,

            temperature=0.7,

        )

        

        action_plan = json.loads(response['choices'][0]['message']['content'].strip())

        state["action_plan"] = action_plan

        return action_plan



class BusinessPlanAgent(Agent):

    def run(self, state: State):

        tiger_scroll = state["tiger_scroll"]

        internal_environment = state["internal_environment"]

        external_environment = state["external_environment"]

        market_voices = state["market_voices"]

        overall_strategy = state["overall_strategy"]

        functional_strategies = state["functional_strategies"]

        action_plan = state["action_plan"]

        

        prompt = f"""

        以下の情報を基に、新規事業計画書を作成してください：

        

        1. 事業計画書作成の虎の巻：

        {json.dumps(tiger_scroll, ensure_ascii=False, indent=2)}

        

        2. 内部環境：

        {json.dumps(internal_environment, ensure_ascii=False, indent=2)}

        

        3. 外部環境：

        {json.dumps(external_environment, ensure_ascii=False, indent=2)}

        

        4. 市場の声：

        {json.dumps(market_voices, ensure_ascii=False, indent=2)}

        

        5. 全体戦略：

        {overall_strategy}

        

        6. 機能別戦略：

        {json.dumps(functional_strategies, ensure_ascii=False, indent=2)}

        

        7. アクションプラン：

        {json.dumps(action_plan, ensure_ascii=False, indent=2)}

        

        事業計画書には以下の項目を含めてください：

        - 事業概要

        - 市場分析

        - 競合分析

        - 事業戦略

        - マーケティング戦略

        - 財務計画

        - リスク分析

        """

        

        response = openai.ChatCompletion.create(

            model="gpt-4o",

            messages=[

                {"role": "system", "content": "You are an excellent Business Plan consultant."},

                {"role": "user", "content": prompt}

            ],

            max_tokens=2048,

            n=1,

            stop=None,

            temperature=0.7,

        )

        

        business_plan = response['choices'][0]['message']['content'].strip()

        state["business_plan"] = business_plan

        return business_plan



# LangGraphの定義

graph = LangGraph(memory=shared_memory)



# エージェントの追加

graph.add_agent("internal_environment", InternalEnvironmentAgent())

graph.add_agent("external_environment", ExternalEnvironmentAgent())

graph.add_agent("market_voice", MarketVoiceAgent())

graph.add_agent("opportunity_threat_extraction", OpportunityThreatExtractionAgent())

graph.add_agent("swot_analysis", SWOTAnalysisAgent())

graph.add_agent("strategy_development", StrategyDevelopmentAgent())

graph.add_agent("action_plan", ActionPlanAgent())

graph.add_agent("business_plan", BusinessPlanAgent())



# エージェントの接続

graph.connect("internal_environment", "external_environment")

graph.connect("external_environment", "market_voice")

graph.connect("market_voice", "opportunity_threat_extraction")

graph.connect("opportunity_threat_extraction", "swot_analysis")

graph.connect("swot_analysis", "strategy_development")

graph.connect("strategy_development", "action_plan")

graph.connect("action_plan", "business_plan")



# ワークフローの実行

graph.run("internal_environment")



# 事業計画書の出力

business_plan = shared_memory.get("business_plan")

print("\n事業計画書:")

print(business_plan)
```


# 3.まとめ

OpenAIの強化学習型ファインチューニングが話題になっていますが、これまでのビッグデータから生成AIの基盤モデルを構築するゴリゴリの方式から、より少ない”やり方”のデータから生成AIが学ぶ方向に大きくトレンドが変化してきているようです。

”やり方”の蓄積は、マルチエージェントのプランニングフェーズの記録を「質問＋プラン＋結果評価」のセットで振り返る仕組みを作ることで実現できると思います。
これを推論時にRAGで追加するか、ファインチューニングで追加することで、SIレベルでも精度向上の工夫ができると考えています。