ChatGPTに指示すると、プログラムを作成してくれます。
「もしかすると、プログラミング初学者向にとって、プログラミング講師の役割を果たしてくれるじゃ?」
そうお考えの方も多いのではないでしょうか?
答えは、半分イエスで、半分ノーです。
この記事は、ChatGPTをプログラミングの講師として使えるか否かについて、私の実体験をもとに、回答したいと思います。
ChatGPTは、「たまに間違うが自信に満ち溢れたプログラマー」

最初に結論から申しますと、簡単な質問はほぼ正しい答えを返してくれますが、質問の仕方が悪かったり、すこし複雑な仕様のプログラムを依頼すると、間違った回答を自信に満ち溢れながら答えてくれます。
ただし、こちらが間違いに気づいて指摘すると、それを認めて訂正してくれる素直さもあります。
つまり、ChatGPTを講師として利用するには、次の点に注意する必要があります。
- 簡単なプログラムの作成依頼にとどめる
- 依頼はなるべく詳しく指示する
- 返された答えが「正しいもの」として信じ込まない
- 動作確認は自分で必ず行う
言い換えると、ChatGPTが返す答えが「正しいか、否か」を判断できるだけのレベルを持っていないと、ChatGPTが出した答えに振り回されることになります。
逆に、プログラマー、或いはプログラム経験者がクラスやメソッドの書き方を確認するとか、他の書き方を探す場合、ChatGPTは強い味方になってくれます。
ChatGPTは簡単なサンプル生成は得意
まず最初に、簡単なプログラム作成をChatGPTにお願いしました。
「DataFrameの任意のカラムに対して、移動平均を計算するPythonのサンプルを教えて下さい」
この依頼を受けて、ChatGPTは次の回答を返してくれました。

以下が提示されたソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import pandas as pd # サンプルデータを作成 df = pd.DataFrame({'date': pd.date_range('2022-01-01', '2022-01-10'), 'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}) # 移動平均を計算する対象のカラムを指定 target_col = 'value' # 移動平均のウィンドウサイズを指定 window_size = 3 # 移動平均を計算する ma = df[target_col].rolling(window_size).mean() # 結果を新しいカラムとしてDataFrameに追加 df[f'{target_col}_MA{window_size}'] = ma print(df.head()) |
Google Colaboratory に貼り付けて実行した結果、下図の通り正しく動作していることが分かります。

これは非常に便利ですね。
いつも良い書き方とは限らない
次に、もうすこし複雑なプログラムの作成依頼をしてみました。
「CSVファイルにカラムXとカラムYがあるものとし、CSVファイルを読み込んでXとYでグラフから散布図を作成するPythonプログラムを作ってください。」
結果は次の通りです。

以下がChatGPTが提示したプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import csv import matplotlib.pyplot as plt # CSVファイル名とX, Yカラムの名前を指定する filename = "example.csv" x_column_name = "X" y_column_name = "Y" # XとYのデータをリストとして読み込む x_data = [] y_data = [] with open(filename) as f: reader = csv.DictReader(f) for row in reader: x_data.append(float(row[x_column_name])) y_data.append(float(row[y_column_name])) # 散布図を作成する plt.scatter(x_data, y_data) plt.xlabel(x_column_name) plt.ylabel(y_column_name) plt.show() |
Google Colaboratoryで動作確認したかったので、filename=””の部分のパスを書き換える必要がありましたが、そこを修正しただけで見事に動きました。素晴らしい!

でも、ちょっと待ってください。プログラムとしては正しいのですが、これが最良かというと、必ずしもそうではありません。
<改良1>
この手のプログラムは pandas を使う事が多いので、次のようにも記述できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import pandas as pd import matplotlib.pyplot as plt # CSVファイル名とX, Yカラムの名前を指定する filename = "/content/drive/My Drive/example.csv" x_column_name = "X" y_column_name = "Y" # XとYのデータをリストとして読み込む df = pd.read_csv(filename) # 散布図を作成する plt.scatter(df[x_column_name],df[y_column_name]) plt.xlabel(x_column_name) plt.ylabel(y_column_name) plt.show() |
<改良2>
あるいは、次のように簡素に書くこともできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import pandas as pd import matplotlib.pyplot as plt # CSVファイル名とX, Yカラムの名前を指定する filename = "/content/drive/My Drive/example.csv" # XとYのデータをリストとして読み込む df = pd.read_csv(filename) # 散布図を作成する plt.scatter(df.X,df.Y) plt.xlabel(df.X.name) plt.ylabel(df.Y.name) plt.show() |
<改良3>
DataFrameのグラフ描画メソッド使うと、次のように短くすることも考えられます。
1 2 3 4 5 6 7 8 9 |
import pandas as pd import matplotlib.pyplot as plt # CSVファイルを読み込む df = pd.read_csv("/content/drive/My Drive/example.csv") # 散布図を作成する df.plot.scatter(x='X', y='Y') plt.show() |
ちなみに、<改良3>は改良<2>をChatGPTに貼り付けて、「もっと簡素に書いて下さい」と依頼して出てきた答えです。
これらは、いずれも正しく動作する「正解」なのですが、質問の仕方によっては、無駄に長いプログラムや、好ましくない書き方が提示される可能性があります。
特に初学者にとっては、提示されたプログラムの良し悪しが判断できないので、間違った書き方を「正しいもの」と理解してしまうかもしれません。
少し複雑なプログラムは苦手
次に、もう少し複雑な仕様でプログラムをお願いしてみました。
「価格.com のウェブサイトから、CPUの型番と金額を取得して、DataFrameに格納するPythonプログラムを作成して下さい。」
わずか1行だけの依頼文ですが、価格.comのページ構成を理解していないと実現できないため、普通に作ればそれなりに時間がかかるプログラムです。
そして、出てきた答えは以下の通りです。

全体の流れは正しいのですが、価格.com のHTMLはそれなりに複雑なので、こんな簡単なプログラムで済むはずはないことは、パッと見れば分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import requests from bs4 import BeautifulSoup import pandas as pd # スクレイピングするページのURL url = 'https://kakaku.com/pc/cpu/' # ページのHTMLを取得 html = requests.get(url).text # BeautifulSoupでHTMLを解析 soup = BeautifulSoup(html, 'html.parser') # CPUの情報が含まれるtableを取得 table = soup.find('table', class_='b-table-sorttable') # tableからCPUの型番と金額を取得してDataFrameに格納 cpu_list = [] for row in table.tbody.find_all('tr'): name = row.find('td', class_='p-itemName').text.strip() price = row.find('td', class_='p-price').text.strip().replace(',', '').replace('円', '') cpu_list.append({'型番': name, '価格': int(price)}) df = pd.DataFrame(cpu_list) print(df.head()) |
Google Colaboratory に貼り付けて実行した結果、案の定エラーになってしまいました。

このように、一見正しそうなプログラムを提示してくれますが、実際は正しく動きませんでした。
従って、プログラムの中身を理解した上で問題個所を特定し、正しく動くようにプログラムを修正するという、いわゆるデバッグが必要になります。
初学者にとってこれは非常に難易度が高くなります。
同じ答えを繰り返す
ChatGPTが返してくれるプログラムにミスがある場合、間違いを指摘すると「誤りがありました。ご指摘ありがとうございます」と言って修正済みコードを提示してくれます。
しかし、そのコードは全く修正されず、間違ったままのプログラムが修正済みとして提示されます。
こちらがその点に気づいて指摘すると、やはり誤りを認めて修正済みのコードを提示してはくれますが、これも修正されていません。
今回は3~4回この問答を繰り返しましたが、結局これ以上の進展が期待できなかったので、別の方法で計算するように依頼し、なんとか解決しました。
回答されるプログラムが単純に間違っているのではなく、それまでの処理の流れから考慮すべき点が抜けていて、そのことにChatGPTが気づいていないため、同じ回答を繰り返しているのかもしれません。

まとめ
今回は、ChatGPTがプログラミング学習の講師として使えるかどうかについて検証してみました。
私も2週間くらい仕事でChatGPTを使っていますが、出てきた答えが間違っていることも多く、何度も間違いを指摘してやっと答えにたどり着くこともありますが、解決できなかったケースも少なくはありません。
しかし、クラスやメソッドの使い方をサンプル付きで提示してくれたり、「こんな書き方もあるのか」という気づきを得ることも多いので、今では手放せない存在になっています。
ChatGPTは細かく指示するとそれなりの品質のプログラムを作成してくれますし、プログラムの文法エラーの指摘も素早くやってくれますので、是非興味のある方は使ってみてください。