LG U+ Why Not SW CAMP 7기 - 15주차 회고

God menu·2025년 8월 22일

<8/18 67일차>

오늘부터 다시 파이썬으로 넘어와서 시각화 라이브러리에대해 배운다.

Seaborn

  • 파이썬의 오픈소스 시각화 라이브러리
  • Matplotlib기반으로 구축되어 있으며, 통계적 시각화에 특화
  • Figure, Axes, Xticks등이 불필요
  • 데이터프레임과 x, y에 해당하는 열 이름 지정
  • hue 매개변수 : 다양한 범주 값에 의한 그래프 작성
Seaborn으로 scatter차트를 그려서 `total_bill`과 `tip`이 양의 상관관계임을 알 수 있다.

Plotly

  • 파이썬의 오픈소스 시각화 라이브러리
  • 대화형 그래프 생성에 특화되어 있으며, 웹 기반으로 작동
  • Business Intelligence 대시보드로 개발된 도구
Plotly로 scatter차트를 그려서 연도별 인터넷 사용자 수를 시각화한다. 각 점의 색상과 모양이 국가별로 구분된다.

regplot

  • 파이썬의 Seaborn 라이브러리에서 제공하는 함수로, 산점도(scatter plot)와 회귀선(regression line)을 함께 그리는 데 사용
  • ci 매개변수 : 오차구간
total_bill에 따른 tip의 scatter 차트를 생성한다. 흡연 여부(smoker)에 따라 점들의 색을 다르게 표시하여 두 그룹의 데이터를 구분한다.

이들 외에도 lineplot, boxplot, violin plot, barplot, hist 등 여러 차트들을 그려보며 다양한 시각화 차트들에 대해 배워볼 수 있었다.

여러 종류의 차트를 실습하면서, 단순히 "그래프를 그린다"가 아니라 데이터의 패턴을 읽는 눈이 더 중요하다는 걸 느낄 수 있었다. 시각화는 결과물을 예쁘게 만드는 것도 중요하지만, 의미 있는 인사이트를 전달하는 과정이라는 점도 다시 한번 깨달았다. 이번 주에는 시각화 차트에 더욱 익숙해지며 어떤 상황에 어떤 라이브러리를 써야 할지 선택 기준이 더 명확히할 수 있으면 좋을 것 같다.


<8/19 68일차>

어제에 이어 오늘도 시각화에 대해 배우며 여러 차트들을 그렸다.

Plotly Express 라이브러리를 사용하여 주식 데이터의 종가(Close)를 시각화하는 차트를 그려보았다.

matplotlib와 seaborn 라이브러리를 사용해 하나의 그래프에 세 개의 Y축을 갖는 복합 그래프를 그려보았다.

연료 소비량과 이산화탄소 배출량 간의 관계를 나타내는 산점도를 그려보았다.

연료 소비량과 이산화탄소 배출량의 관계를 시각화하고, 특히 특정 데이터 포인트에 ethanol is ???라는 주석을 달아주었다. 또한, 연료 유형(Fuel Type)에 따라 점의 색깔을 구분하고, 범례를 그래프 밖으로 옮겨 가독성을 높이는 차트를 그려보았다.

Plotly Express를 사용하여 특정 데이터의 추세를 로그 스케일로 시각화해보았다. Y축을 로그 스케일로 설정하여 확진자 수(confirmed)가 급격히 증가하는 초기 단계를 포함한 전체적인 확산 추세를 한눈에 파악하기 용이하다.

  • plotly 색상팔레트
    • 범주형 : px.colors.qualitative
    • 연속형 : px.colors.sequential
    • 양극형 : px.colors.diverging
    • 주기적 데이터 : px.colors.cyclical

matplotlib과 seaborn을 활용해 여러 개의 Y축을 하나의 그래프에 담는 복합 그래프를 직접 구현해본 것이 신기했고, 또한 산점도에 주석을 추가하고 범례를 밖으로 이동시키며, 그래프의 가독성을 높이는 세부 기술이 얼마나 중요한지도 알게 됐다. plotly 색상 팔레트를 통해 데이터의 성격(범주형, 연속형 등)에 따라 시각화 색을 전략적으로 고를 필요성도 느꼈다.


<8/20 69일차>

스트림릿(Streamlit)은 빠르고 쉽게 웹 애플리케이션을 만들 수 있도록 해주는 오픈소스 Python 라이브러리이다. Streamlit Community Cloud를 통해 무료로 애플리케이션을 배포하고 공유할 수 있다. 오늘은 스트림릿으로 웹페이지를 작성해보는 것으로 시간을 보냈다.

기본적인 문법들에 대해 먼저 배웠다.
st.title(), st.text(), st.write(), st.header(), st.subheaer(), st.diveder() 등을 이용해 웹페이지에 텍스트들을 출력할 수 있으며 마크다운에서의 ---처럼 줄도 그을 수 있다.

st.button()함수로 웹페이지에 클릭할 수 있는 버튼도 생성할 수 있다.

st.button('Reset', type='primary')


def button_write():
    st.write('버튼이 클릭되었습니다')
    

st.button('activate', on_click=button_write)
st.button('activate2', type='primary')
`activate`버튼을 누르면 저렇게 버튼이 클릭되었다는 텍스트가 뜨게 만들어보았다. key 속성을 주면 같은 이름의 버튼 여러개도 만들 수 있다.

st.markdown()함수는 마크다운처럼 쓸 수 있다. 이 벨로그가 마크다운 형식이라 나는 마크다운이 더 편할 것 같다는 생각이 든다.

마찬가지로 st.code()함수로 코드처럼 쓸 수도 있다.

st.checkbox(), st.toggle(), st.selectbox(), st.radio(), st.multiselect(), st.slider(), st.text_input(), st.file_uploader() 함수들을 써보면서 직접 웹페이지에 나타나는 것을 볼 때마다 신기했다.

단순히 웹페이지에 작성해보고 띄우는 실습도 해보고 이후에는 웹페이지의 레이아웃도 나눠보았다. st.tabs()함수로 탭을 나누어보기도 하고 st.sidebar로 사이드바에 header나 selectbox를 넣을 수 있다. 그리고 이미지도 넣어보는 것을 마지막으로 수업이 마무리되었다.

오늘 수업을 통해 처음으로 스트림릿을 직접 다뤄보면서 웹페이지를 만드는 과정이 생각보다 직관적이라는 점이 가장 크게 느껴졌다. 다양한 입력 위젯들을 직접 실습해보면서, 내가 작성한 코드가 즉시 시각적으로 반영되는 점이 흥미로웠다. 예전 수업 초반에는 html로 웹페이지를 작성해본 것이 생각나기도 하면서 html보단 스트림릿이 난이도가 좀 더 쉬운 것 같다. 오늘 배운 내용을 바탕으로 다음주에 진행될 우리 팀의 2차 프로젝트를 스트림릿으로 구현해보고 싶기도 하다.


<8/21 70일차>

오늘은 Streamlit을 활용하여 프로젝트의 프로토타입을 만들어보았다.

title은 우리 프로젝트의 주제, 사이드바에는 프로토타입으로 카메라, 객체 인식, 전광판, Map & 통계와 함께 우리 팀의 로고 이미지도 넣었다. 각 사이드바 페이지별 화면을 구성하였다. 카메라, 객체 인식, 전광판 페이지는 어제 배운 스트림릿 문법들을 가지고 작성하였고, Map & 통계페이지는 우리의 친구 챗GPT의 도움을 받았다. 😅

Map에서는 자율주행차가 카메라로 야생동물을 인식했을 때의 지점을 핀포인트로 찍고, 그를 바탕으로 야생동물 출몰과 사고 빈도를 통계로 알려주는 것의 우리 프로젝트의 대시보드가 될 것이다. 지도는 follium을 사용하였고, 아래처럼 임의로 내가 고라니와 고양이로 출몰, 사고를 각각 지도에 찍어보았다.

출몰 지점은 초록색 핀포인트, 사고 지점은 빨간색 핀포인트로 찍힌다.

지도에 찍힘과 동시에 데이터프레임으로 전환하여 통계로도 보여지게 한다.

스트림릿을 활용해서 각자 프로젝트에 맞게 프로토타입을 제작하는 것으로 대부분의 시간을 보냈고 수업 막바지에 프롬프트에 대한 설명을 들으며 OpenAI 플랫폼에 가입하여 키를 발급받아보는 것으로 마무리하였다. 프로토타입을 디자인적으로도 더욱 보기좋게 만들고 싶었으나 시간적 제한도 있었고, 친구가 작성해준 코드도 아직 제대로 이해한 건 아니라서 이번 주에 복습 겸 코드를 다시 살펴볼 것이다. 확실히 html보다 스트림릿으로 하는 것이 코드를 저장하자마자 바로 새로고침하여 볼 수도 있고 코드도 좀 더 직관적인 느낌이라서 흥미로웠다.


<8/22 71일차>

오늘은 프롬프트에 대해서 배우고, OpenAI API 실습과 이를 활용해 주식 데이터로 보고서를 프롬프트로 작성해보는 실습을 하였다.

프롬프트의 종류

  • Zero-shot 프롬프트 : 예시를 전혀 포함하지 않고 모델에게 직접적인 지시만으로 작업을 요청하는 프롬프트
  • Few-shot 프롬프트 : 여러 개의 예시를 포함하여 맥락 속에서 학습할 수 있도록 하는 기법
  • 역할 지시 프롬프트 : 모델에게 특정한 역할이나 인격을 부여하여, 그 관점과 말투로 답변을 생성하도록 유도하는 기법

프롬프트 엔지니어링에서는 모델의 답변 내용뿐 아니라 출력 형식을 제어하는 것도 중요하다. 원하는 출력 형식을 명확히 지시함으로써, 결과를 후속 처리하거나 읽기 쉽게 만들 수 있다. 아래처럼 모델은 gpt-4o-mini로 지정하고 역할도 주고 구체적인 상황 설명과 함께 답변을 요구해보았다.

랭체인(LangChain)은 대규모 언어 모델(LLM)을 기반으로 한 애플리케이션 개발을 위한 오픈 소스 프레임워크이다.

이후 실습을 진행하였는데 Meilisearch 검색엔진을 활용하여 사용자가 검색어를 입력하면 ChatOpenAI 프롬프트 실행하여 마크다운 보고서를 생성해보는 실습이다.

데이터는 아래와 같은 주가 종목 정보 데이터이다.

이 데이터를 검색엔진에 올린다. 오늘 실습한 파일들은 다음과 같다.

  • report_service : ChatOpenAI 프롬프트 실행부. 입력 컨텍스트를 받아 보고서 마크다운을 반환한다.
  • search : Meilisearch 검색엔진을 연결하고, client.index('nasdaq').search(query)로 종목 심볼/회사명을 검색한다.
  • stock_info : get_basic_info(), get_financial_statement()yfinance.Ticker에서 데이터 수집 후 마크다운으로 제공한다.
  • app.py : investment_report(), stock_search()를 호출해 전체 플로우를 오케스트레이션한다.

동작 흐름은 다음과 같다.

스트림릿으로 열린 브라우저를 확인해보면 잘 basic정보와 financial정보가 잘 들어와있고, gpt-4o-mini가 작성해준 보고서도 깔끔하게 들어온 것을 볼 수 있다. 여기서 더 개선할 수 있는데, 프롬프트를 개선하거나 더 성능이 좋은 모델을 사용하는 방법 등이 있다.

오늘 수업에서는 프롬프트 엔지니어링을 중심으로 실습을 진행하면서, 단순히 모델에게 질문을 던지는 것이 아니라 어떻게 요청하느냐에 따라 결과물이 크게 달라진다는 점을 실감할 수 있었다. 특히 OpenAI API를 직접 사용해 주식 데이터를 불러오고, 이를 기반으로 보고서를 자동 생성하는 과정을 경험하면서 프롬프트가 실제 데이터 분석과도 자연스럽게 연결될 수 있다는 점이 흥미로웠다.

0개의 댓글