본문 바로가기
프로그램 개발

ChatGPT만으로 프로그램 만들어보기 1

by minchel1128 2023. 3. 24.

ChatGPT가 코딩 능력이 어디까지 되는지 알아보고자 한번 만들어 보았습니다.

파이썬을 이용하여 구현을 하며 아나콘다와 주피터 노트북을 이용해서 구동을 해보겠습니다.

여기서 사용된 ChatGPT는 GPT 4를 사용하는 버전이 아닌 무료버전인 GPT 3.5를 사용하는 버전입니다.


지진 정보(위도와 경도 포함)를 이용하여 지도에 점을 찍고 그 점에 시간을 표현하도록 작성해 보라고 하였습니다.

그 결과 ChatGPT는 아래와 같은 코드를 작성해 주었습니다.

import pandas as pd
import folium

# 엑셀 파일에서 데이터를 읽어옵니다.
data = pd.read_excel('earthquake_data.xlsx')

# 지도의 중심 위치를 설정합니다.
center = [37.5, 127]

# folium 지도 객체를 생성합니다.
m = folium.Map(location=center, zoom_start=7)

# 데이터를 순회하며 점을 표시합니다.
for idx, row in data.iterrows():
    lat = row['위도']
    lon = row['경도']
    time = row['시간']

    # 점을 추가합니다.
    folium.Marker(location=[lat, lon], tooltip=f"시간: {time}").add_to(m)

# 지도를 HTML 파일로 저장합니다.
m.save('map.html')

그리고 설명으로 이렇게 작성하였습니다.

이 코드는 pandas와 folium 라이브러리를 사용하여 지도에 점을 표시합니다. 엑셀 파일에서 데이터를 읽어와서, 각 데이터에 대해 위도, 경도, 시간 정보를 추출합니다. 이후 folium 지도 객체를 생성하고, 데이터를 순회하며 점을 추가합니다. 마지막으로 지도를 HTML 파일로 저장합니다.

위 코드에서 location 옵션에는 [위도, 경도] 형식으로 값을 입력하고, tooltip 옵션에는 마우스를 올리면 표시될 툴팁의 내용을 입력합니다. 이 코드에서는 시간 정보를 표시하기 위해 tooltip 옵션에 f"시간: {time}" 형식으로 값을 입력했습니다.

이렇게 작성된 코드를 실행하면, map.html 파일이 생성되고, 해당 파일을 열어보면 지도에 점과 시간 정보가 표시된 것을 확인할 수 있습니다.

그런데 데이터를 정리하다 보니 규모 부분이 있어 이 또한 추가하고 싶어서 추가적으로 수정을 요청하였습니다.

그래서 나온 결과물은 다음과 같습니다.

import pandas as pd
import folium

# 엑셀 파일에서 데이터를 읽어옵니다.
data = pd.read_excel('earthquake_data.xlsx')

# 지도의 중심 위치를 설정합니다.
center = [37.5, 127]

# folium 지도 객체를 생성합니다.
m = folium.Map(location=center, zoom_start=7)

# 데이터를 순회하며 원과 점을 표시합니다.
for idx, row in data.iterrows():
    lat = row['위도']
    lon = row['경도']
    time = row['시간']
    mag = row['규모']

    # 지진 규모에 따라 반지름을 계산합니다.
    radius = mag * 10000

    # 원과 점을 추가합니다.
    folium.CircleMarker(location=[lat, lon], radius=radius, fill=True, color=None, fill_color='red', tooltip=f"시간: {time} / 규모: {mag}").add_to(m)

# 지도를 HTML 파일로 저장합니다.
m.save('map.html')

설명으로는 다음과 같습니다.

지진 규모를 추가하기 위해서는 데이터에서 지진 규모 정보를 추출한 후, 지진 규모에 따른 원의 크기를 계산해야 합니다. 이 코드에서는 mag * 10000을 반지름으로 사용하여, 지진 규모가 클수록 원의 크기가 커지도록 하였습니다. 또한, fill=True로 설정하여 원 내부를 색칠하도록 하였으며, fill_color='red'로 설정하여 원을 빨간색으로 채웁니다. CircleMarker 객체에서 color 옵션을 None으로 설정하면, 원의 테두리가 그려지지 않습니다. 마지막으로 tooltip 옵션에는 시간과 지진 규모 정보를 모두 포함하도록 입력하였습니다. 이렇게 작성된 코드를 실행하면, map.html 파일이 생성되고, 해당 파일을 열어보면 지도에 지진 규모에 따라 다른 크기의 원과 시간 정보가 표시된 것을 확인할 수 있습니다.

그리고 프로그램을 실행시켰을 때 다음과 같은 모습을 볼 수 있었습니다.

문제없이 실행된 모습

데이터 정리를 한 결과 코드는 이상 없이 실행되었습니다.

?

정상적으로 출력은 되었지만 아무것도 보이지 않는 모습을 보였습니다. 여기서 원 크기를 줄이면 되지만(10 정도로 줄이면 확인 가능했습니다.) 그것도 가능한지 일부로 요청해 보았습니다.

그랬더니 실험적인 값으로 찾아야 된다면서 원의 크기를 500, 100, 50으로 계속 감소시켜서 작성했습니다. 다만 시간상 어차피 나머지는 같기 때문에 그냥 적절한 값으로 자체적으로 수정해 보았습니다. 그리고 어차피 계속 물어보는 것도 시간낭비여서 그냥 값을 수정하여 진행하였습니다.

01
수정 전

원의 크기를 5로 두었을 때 다음과 같은 화면이 출력되었습니다.

따라서 최종적으로 사용한 코드는 다음과 같습니다.

import pandas as pd
import folium

# 엑셀 파일에서 데이터를 읽어옵니다.
data = pd.read_excel('earthquake_data.xlsx')

# 지도의 중심 위치를 설정합니다.
center = [37.5, 127]

# folium 지도 객체를 생성합니다.
m = folium.Map(location=center, zoom_start=7)

# 데이터를 순회하며 원과 점을 표시합니다.
for idx, row in data.iterrows():
    lat = row['위도']
    lon = row['경도']
    time = row['시간']
    mag = row['규모']

    # 지진 규모에 따라 반지름을 계산합니다.
    radius = mag * 5

    # 원과 점을 추가합니다.
    folium.CircleMarker(location=[lat, lon], radius=radius, fill=True, color=None, fill_color='red', tooltip=f"시간: {time} / 규모: {mag}").add_to(m)

# 지도를 HTML 파일로 저장합니다.
m.save('map.html')

 


해당 자료는 기상청에서 제공하는 국내 발생 지진 정보 엑셀파일(1978년 8월 30일 ~ 2023년 3월 14일, 규모 2.0 이상)을 양식에 맞게 위도, 경도, 시간, 규모만 남기고 제거하고 일부 누락 데이터를 제거한 수정된 파일을 사용했고 지도는 오픈스트리트맵을 사용하여 html파일로 출력하였습니다. 기본적으로 오픈스트리트맵을 사용하도록 되어있어 저렇게 표시된 것으로 추정됩니다.

생각보다 정상적으로 나온 것이 놀랍기도 하며 주석까지 달아놓은 것이 대단해 보였습니다. 다음번에는 규모를 조금 더 확장하여 복잡한 코드 작성을 요청해 볼 생각입니다.

728x90
반응형