AIによって実行される経済タスク：数百万のClaude会話からの証拠

*Handa et al., 2025*

このノートブックでは、「AIによってどのような経済タスクが実行されているか？：数百万のClaude会話からの証拠」という研究の分析を再現します。この研究は、AIアシスタントであるClaudeがどのような職業的タスクや仕事で使用されているかを分析しています。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">Anthropicが出した会話履歴の解析データ「Economic Index」の📒ノートブックを日本語にしてみた！ <a href="https://t.co/uoVTe0IMGP">https://t.co/uoVTe0IMGP</a> <a href="https://t.co/jJpPzsNq4v">pic.twitter.com/jJpPzsNq4v</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1896558165740970086?ref_src=twsrc%5Etfw">March 3, 2025</a></blockquote> 

## 環境設定とライブラリのインポート

まずは必要なライブラリをインポートします。

```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from textwrap import wrap
import numpy as np

# カラーパレットの設定
palette = sns.color_palette("colorblind")
```

## データセットの取得

Hugging Faceからデータセットをクローンします。

```python
!git clone https://huggingface.co/datasets/Anthropic/EconomicIndex
```

```python
%cd /content/EconomicIndex
```

## CSVファイルの探索

リポジトリ内の各CSVファイルを調査し、データの理解を深めます。

### SOC構造データ

SOC（Standard Occupational Classification：標準職業分類）の構造を示すデータで、職業カテゴリを階層的に分類しています。

```python
# SOC構造データの読み込み
soc_df = pd.read_csv("SOC_Structure.csv")

# 最初の数行を表示
print("SOC_Structure.csvの最初の5行:")
display(soc_df.head())

# 基本統計情報の表示
print("\nSOC_Structure.csvの基本統計情報:")
display(soc_df.describe(include='all'))
```

### 自動化vs拡張データ

AIとの対話パターンを「自動化」と「拡張」の観点から分類したデータです。「directive（指示）」や「feedback loop（フィードバックループ）」などの対話タイプとその割合が含まれています。

```python
# 自動化vs拡張データの読み込み
auto_aug_df = pd.read_csv("automation_vs_augmentation.csv")

# すべての行を表示（小さいファイルのため）
print("automation_vs_augmentation.csvの内容:")
display(auto_aug_df)
```

### BLS雇用データ

米国労働統計局（Bureau of Labor Statistics：BLS）の2023年5月時点の雇用統計データで、各職業カテゴリの従業員数が含まれています。

```python
# BLS雇用データの読み込み
bls_df = pd.read_csv("bls_employment_may_2023.csv")

# 最初の数行を表示
print("bls_employment_may_2023.csvの最初の5行:")
display(bls_df.head())

# 基本統計情報の表示
print("\nbls_employment_may_2023.csvの基本統計情報:")
display(bls_df.describe(include='all'))
```

### O*NETタスクマッピング

O*NET（Occupational Information Network：職業情報ネットワーク）のタスク記述とClaude会話でのそのタスクの出現割合（パーセンテージ）を示すデータです。

```python
# O*NETタスクマッピングの読み込み
task_mappings_df = pd.read_csv("onet_task_mappings.csv")

# 最初の数行を表示
print("onet_task_mappings.csvの最初の5行:")
display(task_mappings_df.head())

# 基本統計情報の表示
print("\nonet_task_mappings.csvの基本統計情報:")
display(task_mappings_df.describe(include='all'))
```

### O*NETタスク声明

O*NETデータベースから取得したタスクの詳細な記述と、それらのタスクを含む職業のコードや名称が含まれています。

```python
# O*NETタスク声明の読み込み
onet_df = pd.read_csv("onet_task_statements.csv")

# 最初の数行を表示
print("onet_task_statements.csvの最初の5行:")
display(onet_df.head())

# 基本統計情報の表示
print("\nonet_task_statements.csvの基本統計情報:")
display(onet_df.describe(include='all'))
```

### 賃金データ

各職業の中央値賃金や雇用予測などの情報が含まれているデータです。自動化の可能性スコア（ChanceAuto）も含まれています。

```python
# 賃金データの読み込み
wage_df = pd.read_csv("wage_data.csv")

# 最初の数行を表示
print("wage_data.csvの最初の5行:")
display(wage_df.head())

# 基本統計情報の表示
print("\nwage_data.csvの基本統計情報:")
display(wage_df.describe(include='all'))
```

## O*NETとSOCデータの結合

O*NET（職業情報ネットワーク）のタスク声明とSOC（標準職業分類）の構造データを結合する関数を定義します。

```python
def merge_onet_soc_data() -> pd.DataFrame:
    """
    O*NETタスク声明とSOC（標準職業分類）データを
    主要グループコードに基づいて結合します。
    
    Returns:
        pd.DataFrame: O*NETデータとSOC主要グループタイトルを含む結合されたデータフレーム
    """

    # O*NETデータの読み込みと処理
    onet_df = pd.read_csv("onet_task_statements.csv")
    onet_df["soc_major_group"] = onet_df["O*NET-SOC Code"].str[:2]

    # SOCデータの読み込みと処理
    soc_df = pd.read_csv("SOC_Structure.csv")
    soc_df = soc_df.dropna(subset=['Major Group'])
    soc_df["soc_major_group"] = soc_df["Major Group"].str[:2]

    # データセットの結合
    merged_df = onet_df.merge(
        soc_df[['soc_major_group', 'SOC or O*NET-SOC 2019 Title']],
        on='soc_major_group',
        how='left'
    )

    return merged_df
```

関数を呼び出してデータを結合します。

```python
task_occupations_df = merge_onet_soc_data()
```

タスク名を正規化し、重複を確認します。

```python
# タスク名の正規化
task_occupations_df["task_normalized"] = task_occupations_df["Task"].str.lower().str.strip()

# タスクごとの職業出現回数をカウント
task_occupations_df["n_occurrences"] = task_occupations_df.groupby("task_normalized")["Title"].transform("nunique")

# データフレームの確認
task_occupations_df.head()
```

## タスクマッピングの読み込みと結合

タスクマッピングデータを読み込み、先ほど作成したデータフレームと結合します。

```python
# タスクマッピングデータの読み込み
task_mappings_df = pd.read_csv("onet_task_mappings.csv")

# データの結合
grouped_with_occupations = task_mappings_df.merge(
    task_occupations_df,
    left_on="task_name",
    right_on="task_normalized",
    how="left"
)

# 職業ごとの割合を計算
grouped_with_occupations["pct_occ_scaled"] = 100 * (grouped_with_occupations["pct"] / grouped_with_occupations["n_occurrences"]) / (grouped_with_occupations["pct"] / grouped_with_occupations["n_occurrences"]).sum()

# 合計が100%になることを確認
print(f"合計割合: {grouped_with_occupations['pct_occ_scaled'].sum():.2f}%")
```

## 可視化の設定

プロットのスタイルとフォントサイズを設定します。

```python
# スタイルとフォントサイズの設定
plt.rcParams['font.size'] = 12  # 基本フォントサイズ
plt.rcParams['axes.titlesize'] = 14  # タイトルフォントサイズ
plt.rcParams['axes.labelsize'] = 12  # 軸ラベルサイズ
plt.rcParams['xtick.labelsize'] = 11  # X軸目盛りラベルサイズ
plt.rcParams['ytick.labelsize'] = 11  # Y軸目盛りラベルサイズ
plt.rcParams['legend.fontsize'] = 11  # 凡例フォントサイズ
plt.rcParams['figure.titlesize'] = 16  # 図タイトルサイズ

# seabornコンテキストの設定
sns.set_context("notebook", font_scale=1.2)
```

## タスク分析：上位タスクの可視化

Claudeの会話で最も頻繁に現れる上位10のタスクを可視化します。最も多いのはソフトウェアの修正やエラー訂正などの開発関連タスクです。

```python
# 全体での上位10タスクを取得
total_tasks = (grouped_with_occupations.groupby("Task")["pct_occ_scaled"]
               .sum()
               .sort_values(ascending=False))
top_10_tasks = total_tasks.head(10).index

# プロット用データフレームの作成
plot_df = (grouped_with_occupations[grouped_with_occupations["Task"].isin(top_10_tasks)]
           .groupby(["Task"])["pct_occ_scaled"]
           .sum()
           .reset_index())

# タスクを全体の頻度でソート
task_order = (plot_df.groupby("Task")["pct_occ_scaled"]
              .sum()
              .sort_values(ascending=False)
              .index)
plot_df["Task"] = pd.Categorical(plot_df["Task"], categories=task_order, ordered=True)

# プロットの作成
plt.figure(figsize=(16, 12))
sns.barplot(
    data=plot_df,
    x="pct_occ_scaled",
    y="Task",
    color=palette[0],
)

# タスクタイトルの折り返し
ax = plt.gca()
ax.set_yticklabels(['\n'.join(wrap(label.get_text(), width=40))
                    for label in ax.get_yticklabels()])

# X軸をパーセンテージとしてフォーマット
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.1f}%'))

# プロットのカスタマイズ
plt.title('Top Tasks by % of Conversations')
plt.xlabel('Percentage of Records')
plt.ylabel('O*NET Task')

# レイアウトの調整
plt.tight_layout()

plt.show()
```

この図は、Claude会話で最も頻繁に行われているタスクを示しています。トップのタスクは「既存ソフトウェアの修正（エラー修正、新しいハードウェアへの適応、インターフェース改善など）」で、全体の約4.5%を占めています。次いで「エラー修正とプログラムの再チェック」が約3.0%、その他のソフトウェア開発・デバッグ関連タスクが続きます。上位タスクのほとんどが技術的な内容であることがわかります。

## 職業分析：上位職業の可視化

Claudeの会話に最も関連する上位15の職業を可視化します。コンピュータプログラマーやソフトウェア開発者が上位を占めています。

```python
# 職業ごとのパーセンテージを計算
plot_df = (grouped_with_occupations.groupby("Title")["pct_occ_scaled"]
           .sum()
           .reset_index())

# 全体での上位職業を取得
total_occs = (plot_df.groupby("Title")["pct_occ_scaled"]
              .sum()
              .sort_values(ascending=False))
top_occs = total_occs.head(15).index

# 上位職業でフィルタリング
plot_df = plot_df[plot_df["Title"].isin(top_occs)]

# 職業を全体の頻度でソート
occ_order = (plot_df.groupby("Title")["pct_occ_scaled"]
             .sum()
             .sort_values(ascending=False)
             .index)
plot_df["Title"] = pd.Categorical(plot_df["Title"], categories=occ_order, ordered=True)

# プロットの作成
plt.figure(figsize=(18, 16))
sns.barplot(
    data=plot_df,
    x="pct_occ_scaled",
    y="Title",
    color=palette[0],
)

# 職業タイトルの折り返し
ax = plt.gca()
ax.set_yticklabels(['\n'.join(wrap(label.get_text(), width=40))
                    for label in ax.get_yticklabels()])

# X軸をパーセンテージとしてフォーマット
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.1f}%'))

# プロットのカスタマイズ
plt.title('Top Occupations by % of Conversations')
plt.xlabel('Percentage of Conversations')
plt.ylabel('Occupation')

# レイアウトの調整
plt.tight_layout()

plt.show()
```

この図は、Claude会話における上位15職業の割合を示しています。「コンピュータプログラマー」が約6%で最も多く、次いで「システムソフトウェア開発者」（約5%）、「アプリケーション開発者」（約3.5%）と続きます。上位10位までのほとんどがIT関連職業であり、テクニカルライターやコピーライターなどのコンテンツ作成職も含まれています。この結果は、Claudeが主にソフトウェア開発やテクニカルコンテンツ作成に使用されていることを示しています。

## 職業カテゴリ分析

SOCの職業カテゴリごとの会話割合を可視化します。「コンピュータと数学」カテゴリが圧倒的に多いことがわかります。

```python
# 職業カテゴリごとのパーセンテージを計算
plot_df = (grouped_with_occupations.groupby("SOC or O*NET-SOC 2019 Title")["pct_occ_scaled"]
           .sum()
           .reset_index())

# カテゴリをグループ1の頻度でソート
cat_order = plot_df.sort_values("pct_occ_scaled", ascending=False)["SOC or O*NET-SOC 2019 Title"]
plot_df["SOC or O*NET-SOC 2019 Title"] = pd.Categorical(
    plot_df["SOC or O*NET-SOC 2019 Title"],
    categories=cat_order,
    ordered=True
)

# プロットの作成
plt.figure(figsize=(18, 16))
sns.barplot(
    data=plot_df,
    x="pct_occ_scaled",
    y="SOC or O*NET-SOC 2019 Title",
    color=palette[0],
)

# カテゴリラベルの折り返しと" Occupations"文字列の削除
ax = plt.gca()
ax.set_yticklabels(['\n'.join(wrap(label.get_text().replace(" Occupations", ""), width=60))
                    for label in ax.get_yticklabels()])

# X軸をパーセンテージとしてフォーマット
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.1f}%'))

# プロットのカスタマイズ
plt.title('Occupational Categories by % of Conversations')
plt.xlabel('Percentage of Conversations')
plt.ylabel('Occupational Category')

# レイアウトの調整
plt.tight_layout()

plt.show()
```

この図は、職業カテゴリ別のClaude会話の割合を示しています。「コンピュータと数学」カテゴリが約35%と圧倒的に多く、2位の「芸術、デザイン、エンターテイメント、スポーツ、メディア」（約10%）と大きな差があります。続いて「教育指導と図書館」「事務・管理サポート」「生命・物理・社会科学」などのカテゴリが続きます。この結果から、Claudeは主にIT関連の職業で使用されていることがわかりますが、クリエイティブ職や教育分野でも一定の利用があることが示されています。

## BLS雇用データとの比較

米国労働統計局（BLS）の雇用データとClaudeの使用状況を比較します。実際の労働市場とClaude利用には大きな差があります。

```python
# 雇用データの読み込み
bls_employment_df = pd.read_csv("bls_employment_may_2023.csv")

# Claudeの職業カテゴリ分布を計算
claude_employment_df = grouped_with_occupations.groupby("SOC or O*NET-SOC 2019 Title")["pct_occ_scaled"].sum().reset_index(name='claude_distribution')

# データの結合
employment_df = claude_employment_df.merge(bls_employment_df,
                                     on='SOC or O*NET-SOC 2019 Title',
                                     how='left')

# パーセンテージの計算とデータのセットアップ
plot_df = employment_df.copy()

def get_distribution(df, value_column):
   total = df[value_column].sum()
   return (df[value_column] / total * 100).round(1)

plot_df['bls_pct'] = get_distribution(plot_df, 'bls_distribution')
plot_df['claude_pct'] = get_distribution(plot_df, 'claude_distribution')
plot_df['clean_label'] = plot_df['SOC or O*NET-SOC 2019 Title'].str.replace(' Occupations', '')
plot_df['pct_difference'] = plot_df['claude_pct'] - plot_df['bls_pct']
plot_df = plot_df.sort_values('bls_pct', ascending=True)

# プロットの作成
fig, ax = plt.subplots(figsize=(20, 12))

# 色の設定
claude_color = palette[1]
bls_color = palette[0]

# 線と円の作成
y_positions = range(len(plot_df))
for i, row in enumerate(plot_df.itertuples()):
   # どちらの値が大きいかによって色を決定
   line_color = claude_color if row.claude_pct > row.bls_pct else bls_color

   # BLSとClaude間の線を描画
   ax.plot([row.bls_pct, row.claude_pct], [i, i],
           color=line_color,
           linestyle='-',
           linewidth=2.5,
           zorder=1)

   # ラベル位置の決定
   if row.claude_pct > row.bls_pct:
       bls_ha = 'right'
       claude_ha = 'left'
       bls_offset = -0.4
       claude_offset = 0.4
   else:
       bls_ha = 'left'
       claude_ha = 'right'
       bls_offset = 0.4
       claude_offset = -0.4

   # BLSパーセンテージをプロット
   ax.scatter([row.bls_pct], [i],
              color=bls_color,
              s=200,
              zorder=2,
              label='% of U.S. workers (BLS)' if i == 0 else "")
   ax.text(row.bls_pct + bls_offset,
           i,
           f'{row.bls_pct:.1f}%',
           ha=bls_ha,
           va='center',
           color=bls_color)

   # Claudeのパーセンテージをプロット
   ax.scatter([row.claude_pct], [i],
              color=claude_color,
              s=200,
              zorder=2,
              label='% of Claude conversations' if i == 0 else "")
   ax.text(row.claude_pct + claude_offset,
           i,
           f'{row.claude_pct:.1f}%',
           ha=claude_ha,
           va='center',
           color=claude_color)

# プロットのカスタマイズ
ax.set_xlabel('Percentage')
ax.set_ylabel('Occupational Category')

# X軸にパーセンテージフォーマッタを追加
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.1f}%'))

# Y軸ラベルの設定
ax.set_yticks(y_positions)
ax.set_yticklabels(plot_df['clean_label'])

# 凡例の追加
handles, labels = ax.get_legend_handles_labels()
handles = handles[::-1]
labels = labels[::-1]
ax.legend(handles, labels, loc='lower right', bbox_to_anchor=(1.0, 0.0))

# グリッドとレイアウトの調整
ax.grid(axis='x', linestyle='--', alpha=0.3)
ax.set_axisbelow(True)

# 軸の範囲設定（パディング付き）
max_val = max(plot_df['bls_pct'].max(), plot_df['claude_pct'].max())
min_val = min(plot_df['bls_pct'].min(), plot_df['claude_pct'].min())
padding = (max_val - min_val) * 0.15
ax.set_xlim(min_val - padding, max_val + padding)
ax.set_ylim(-1, len(plot_df))

# レイアウトの調整
plt.tight_layout()
plt.show()
```

この図は、米国労働統計局（BLS）のデータに基づく実際の労働市場の職業分布（青）とClaude会話での職業分布（オレンジ）を比較しています。最も顕著な違いは「コンピュータと数学」カテゴリで、実際の労働市場では3.4%に過ぎませんが、Claude会話では37.2%を占めています。また、「芸術・デザイン・エンターテイメント・スポーツ・メディア」「教育指導と図書館」「生命・物理・社会科学」などのカテゴリもClaude会話での割合が労働市場より高くなっています。一方で「事務・管理サポート」「輸送・物流」「販売」などのカテゴリは実際の労働市場での割合よりもClaude会話での割合が低くなっています。この結果は、Claudeが特定の高度な知識労働・クリエイティブ労働に偏って使用されていることを示しています。

## 賃金分析

職業ごとの賃金とClaude使用率の関係を分析します。高賃金職業ほどClaude使用率が高い傾向が見られます。

```python
# 賃金データの読み込み
wage_df = pd.read_csv("wage_data.csv")

# 賃金と職業データの結合
grouped_with_occupations_and_wage = grouped_with_occupations.merge(wage_df, left_on="O*NET-SOC Code", right_on="SOCcode", how="left")

def create_wage_distribution_plot(plot_df):
    # 図の作成
    plt.figure(figsize=(24, 12))

    # 散布図の作成
    sns.scatterplot(data=plot_df,
                    x='MedianSalary',
                    y='pct_occ_scaled',
                    alpha=0.5,
                    size='pct_occ_scaled',
                    sizes=(60, 400),
                    color=palette[0],
                    legend=False)

    # プロットのスタイル設定
    plt.xlabel('Median Wage ($)')
    plt.ylabel('Percent of Conversations')
    plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.1f}%'.format(y)))

    # タイトルの追加
    plt.title('Wage Distribution by % of Conversations'),

    # ポイントの注釈付け
    # パーセンテージによる上位ポイント
    top_n = 7
    for _, row in plot_df.nlargest(top_n, 'pct_occ_scaled').iterrows():
        plt.annotate('\n'.join(wrap(row['Title'], width=20)),
                    (row['MedianSalary'], row['pct_occ_scaled']),
                    xytext=(5, 5),
                    textcoords='offset points')

    # 極端な給与ポイント
    n_extremes = 2
    # 最低と最高の給与に注釈を付ける
    for df_subset in [plot_df.nsmallest(n_extremes, 'MedianSalary'),
                     plot_df.nlargest(n_extremes, 'MedianSalary')]:
        for i, row in enumerate(df_subset.iterrows()):
            if i != 0:  # すでにtop_nで注釈が付いている場合はスキップ
                plt.annotate('\n'.join(wrap(row[1]['Title'], width=20)),
                            (row[1]['MedianSalary'], row[1]['pct_occ_scaled']),
                            xytext=(5, -15),
                            textcoords='offset points')

    # フォーマット
    plt.ylim(bottom=0)
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f'${x:,.0f}'))

    plt.tight_layout()
    plt.show()
    plt.close()

# 集計辞書の作成（グループ化カラムを除外）
groupby_cols = ["Title"]
agg_dict = {col: 'first' for col in grouped_with_occupations_and_wage.columns
            if col not in groupby_cols}
agg_dict['pct_occ_scaled'] = 'sum'

# プロット用データフレームの作成
plot_df = (grouped_with_occupations_and_wage
            .groupby(groupby_cols)
            .agg(agg_dict)
            .reset_index()
            .copy())

# null値と非常に低い給与をフィルタリング
plot_df = plot_df[plot_df["MedianSalary"].notnull() &
                    (plot_df["MedianSalary"] > 100)]

# 現在のグループのプロットを作成して保存
create_wage_distribution_plot(plot_df)
```

この散布図は、職業の中央値賃金とClaude会話での割合の関係を示しています。上位を占めているのは「コンピュータプログラマー」（約$80,000）、「システムソフトウェア開発者」「アプリケーション開発者」（約$100,000）などの高賃金IT職です。また「生物情報学技術者」（約$50,000）や「ウェブ開発者」（約$75,000）など、中程度の賃金のIT関連職業も多く見られます。最も高い賃金の職業は「産婦人科医」（約$200,000）ですが、会話の割合は非常に小さいです。全体として、高賃金職業ほどClaude会話の割合が高い傾向が見られますが、これは高賃金職業がIT関連であることが多いためと考えられます。

## 自動化と拡張分析

AIとの対話モードを自動化と拡張の観点から分析します。「拡張」目的の使用が「自動化」目的の使用よりもやや多いことがわかります。

```python
# 自動化vs拡張データの読み込み
automation_vs_augmentation_df = pd.read_csv("automation_vs_augmentation.csv")

def adjust_color_brightness(color, factor):
    """色の明るさを係数で調整する"""
    # 色がまだRGBでない場合はRGBに変換
    if isinstance(color, str):
        import matplotlib.colors as mcolors
        color = mcolors.to_rgb(color)
    # RGB値をスケーリングしてより明るくする
    return tuple(min(1.0, c * factor) for c in color)

def plot_interaction_modes(df):
    # データフレームの読み込み
    plot_df = df.copy()

    # interaction_typeを小文字に変換し、フィルタリングして正規化
    plot_df['interaction_type'] = plot_df['interaction_type'].str.lower()
    plot_df = plot_df[plot_df['interaction_type'] != 'none']
    total = plot_df['pct'].sum()
    plot_df['pct'] = plot_df['pct'] / total

    # カテゴリマッピングの作成
    category_map = {
        'directive': 'Automation',
        'feedback loop': 'Automation',
        'task iteration': 'Augmentation',
        'learning': 'Augmentation',
        'validation': 'Augmentation'
    }

    # カテゴリカラムの追加
    plot_df['category'] = plot_df['interaction_type'].map(category_map)

    # プロット用にタイトルケースに変換
    plot_df['interaction_type'] = plot_df['interaction_type'].str.title()

    # 色のバリエーション作成
    colors_a = [
        palette[1],
        adjust_color_brightness(palette[1], 1.3)
    ]

    colors_b = [
        palette[2],
        adjust_color_brightness(palette[2], 1.3),
        adjust_color_brightness(palette[2], 1.6)
    ]

    # 積み上げ棒グラフの作成
    plt.figure(figsize=(16, 6))

    # 各カテゴリのデータフレームを分けて、視覚的な順序に合わせてソート
    automation_df = plot_df[plot_df['category'] == 'Automation'].sort_values('interaction_type', ascending=False)
    augmentation_df = plot_df[plot_df['category'] == 'Augmentation'].sort_values('interaction_type', ascending=False)

    # バーの位置の計算
    bar_positions = [0, 1]
    bar_width = 0.8

    # 各カテゴリの積み上げバーの作成
    left_auto = 0
    handles, labels = [], []  # 凡例の順序付けのための空リストを初期化

    # 最初に自動化バーをプロットするが、そのハンドル/ラベルを保存
    auto_handles, auto_labels = [], []
    for i, (_, row) in enumerate(automation_df.iterrows()):
        bar = plt.barh(0, row['pct'], left=left_auto, height=bar_width,
                color=colors_a[i])
        auto_handles.append(bar)
        auto_labels.append(row['interaction_type'])
        plt.text(left_auto + row['pct']/2, 0,
                f'{row["pct"]*100:.1f}%',
                ha='center', va='center',
                color='white')
        left_auto += row['pct']

    # 拡張バーをプロットしてハンドル/ラベルを保存
    left_aug = 0
    aug_handles, aug_labels = [], []
    for i, (_, row) in enumerate(augmentation_df.iterrows()):
        bar = plt.barh(1, row['pct'], left=left_aug, height=bar_width,
                color=colors_b[i])
        aug_handles.append(bar)
        aug_labels.append(row['interaction_type'])
        plt.text(left_aug + row['pct']/2, 1,
                f'{row["pct"]*100:.1f}%',
                ha='center', va='center',
                color='white')
        left_aug += row['pct']

    # プロットのカスタマイズ
    plt.yticks(bar_positions, ['Automation', 'Augmentation'])
    plt.xlabel('Percentage of Conversations')

    # カスタム順序で凡例を作成
    # ハンドルとラベルを希望の順序で組み合わせる
    all_handles = aug_handles + auto_handles
    all_labels = aug_labels + auto_labels

    # 指定された順序で凡例を作成
    desired_order = ['Validation', 'Task Iteration', 'Learning', 'Feedback Loop', 'Directive']
    ordered_handles = []
    ordered_labels = []

    for label in desired_order:
        try:
            idx = all_labels.index(label)
            ordered_handles.append(all_handles[idx])
            ordered_labels.append(all_labels[idx])
        except ValueError:
            continue

    plt.legend(ordered_handles, ordered_labels, loc='lower right')
    plt.tight_layout()
    plt.show()

# 自動化vs拡張プロットの作成
plot_interaction_modes(automation_vs_augmentation_df)
```

この図は、Claude会話における自動化（Automation）と拡張（Augmentation）の相対的割合と、さらに詳細な対話タイプの内訳を示しています。

**自動化カテゴリ（約42.6%）**:
- Directive（指示型）: 27.8% - ユーザーが明確な指示を出し、Claudeがそれを実行する
- Feedback Loop（フィードバックループ）: 14.8% - 反復的なやり取りで結果を改善していく

**拡張カテゴリ（約57.4%）**:
- Task Iteration（タスク反復）: 31.3% - 同じタスクを何度も繰り返し、徐々に改善する
- Learning（学習）: 23.3% - 新しい知識や洞察を得るためにClaudeを使用する
- Validation（検証）: 2.8% - ユーザーの考えや作業を確認・検証するためにClaudeを使用する

この結果から、Claudeは単なる自動化ツールというよりも、人間の能力を補完・拡張するツールとして多く使用されていることがわかります。特に「タスク反復」と「学習」が最も頻繁に使用される対話パターンであり、これはユーザーがClaudeを使って反復的に問題を解決したり、知識を獲得したりしていることを示しています。

## 結論：AIによって実行される経済タスクの理解

この分析から、AIアシスタントがどのような経済タスクや職業でどのように使用されているかがわかります。主な発見は以下の通りです：

1. **タスク分析**: Claudeは主にソフトウェア開発（コードの修正、エラー修正）、情報検索、テキスト分析・編集などのタスクで使用されています。これらのタスクは高度な認知能力と専門知識を必要とします。

2. **職業分析**: コンピュータプログラマー、ソフトウェア開発者、生物情報学技術者などのIT/技術職でClaudeの使用率が高いです。また、テクニカルライターやエディターなどのコンテンツ作成職でも使用されています。

3. **職業カテゴリとBLSデータの比較**: Claudeの使用は、実際の労働市場の分布とは大きく異なります。「コンピュータと数学」カテゴリでは労働市場の3.4%に対してClaude会話の37.2%を占めており、クリエイティブ職や教育職でも労働市場より高い割合で使用されています。

4. **賃金分析**: Claudeの使用率と職業の賃金の間には相関があり、高給職業（特にIT関連）でより利用される傾向があります。これは、AIツールがより高度で複雑な経済活動を支援していることを示しています。

5. **自動化と拡張**: ユーザーはClaudeをタスクの自動化（42.6%）だけでなく、知識獲得や検証などの能力拡張（57.4%）にも使用しています。特に「タスク反復」と「学習」が主要な対話パターンです。

このデータは、AIツールが現在の労働市場でどのように活用されているかを理解する上で重要な知見を提供し、今後のAIと労働の関係性を考える基盤となります。特に、AIは単なる自動化ツールではなく、人間の能力を拡張し、より高度な知識労働を支援するツールとして使用されていることが示されています。

## 📒ノートブック

https://colab.research.google.com/drive/1zWLoN5yS5RI_xewoKMED29YgoDpsQsNl?usp=sharing

## 参考サイト

https://huggingface.co/datasets/Anthropic/EconomicIndex


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>