文字通り ChatGPT3.5 にパレート図を描く Python プログラムを書かせてみた。
一番最初に提示されたプログラム。全くダメダメプログラム。
import matplotlib.pyplot as plt
# テストデータ (category:count)
data = {"A": 200, "B": 150, "C": 100, "D": 50, "E": 20, "F": 10}
# countを基準に降順にソートする
sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
# 合計値を算出する
total_count = sum(data.values())
# パレート図の描画
fig, ax1 = plt.subplots()
ax1.bar([x[0] for x in sorted_data], [x[1] for x in sorted_data], color='royalblue')
ax1.set_xlabel('Category')
ax1.set_ylabel('Count', color='royalblue')
ax1.tick_params(axis='y', labelcolor='royalblue')
ax2 = ax1.twinx()
cumulative_count = 0
cumulative_percentages = []
for i, (category, count) in enumerate(sorted_data):
cumulative_count += count
cumulative_percent = cumulative_count / total_count * 100
cumulative_percentages.append(cumulative_percent)
ax2.plot([i, i+1], [cumulative_percent, cumulative_percent], color='firebrick', linewidth=2)
ax2.set_ylabel('Cumulative Percentage (%)', color='firebrick')
ax2.tick_params(axis='y', labelcolor='firebrick')
plt.title('Pareto Chart')
plt.xticks(rotation=45, ha='right')
plt.show()
行き違いというか指示不足もあったりで,その後何度もダメ出しして,19回目になってやっとまともな図を描くプログラムを提示してきた。
プログラムの欠点・欠陥を見抜けるか,プログラム・成果物の仕様を発注者(利用者)が正確に把握できているかが重要である。利用者がちゃんとしていないと,故意ではないにしてもChatGPTの不正確・不十分な成果物を受け入れてしまう可能性が高いなあと実感した。
最終成果物(まだ色々直したいところもあるが)
import matplotlib.pyplot as plt
import pandas as pd
# テストデータ
df = pd.DataFrame({
'category': ['E', 'D', 'C', 'B', 'A'],
'count': [10, 15, 20, 23, 25]
})
# カテゴリーを降順に並べ替える
df = df.sort_values('count', ascending=False).reset_index(drop=True)
# パーセントと累積パーセントを計算
df['Percent'] = df['count'] / df['count'].sum() * 100
df['Cumulative percent'] = df['Percent'].cumsum()
# パレート図を描画
fig, ax1 = plt.subplots(figsize=(8,6))
# 棒グラフを描画
ax1.bar(df['category'], df['Percent'], color='tab:blue')
ax1.set_ylabel('Percent', fontsize=14)
ax1.tick_params(axis='y', labelsize=12)
ax1.set_ylim([0, 100])
# 折れ線グラフを描画
ax2 = ax1.twinx()
ax2.plot(df['category'], df['Cumulative percent'], color='tab:red', marker='o')
ax2.set_ylabel('Cumulative percent', fontsize=14)
ax2.tick_params(axis='y', labelsize=12)
ax2.set_ylim([0, 100])
# x 軸のラベルを回転して表示
ax1.set_xticks(range(len(df)))
ax1.set_xticklabels(df['category'], fontsize=12, rotation=90)
# 軸目盛を整数にする
ax1.yaxis.set_major_locator(plt.MaxNLocator(integer=True))
ax2.yaxis.set_major_locator(plt.MaxNLocator(integer=True))
plt.title('Pareto Chart', fontsize=16)
plt.show()