상세 컨텐츠

본문 제목

[우리 FISA 3기 AI엔지니어링] 2주차 후기 (학습정리, 회고)

우리FISA

by Corn/sec 2024. 7. 21. 01:07

본문

 

벌써 우리FISA에 입과한지 2주차가 되었다. 시간이 매우 빠르게 느껴진다.

1주차 보다 친해진 분들도 많고, 여전히 어렵지만 파이썬을 배우는 것도 익숙해지고 있는 주차이다.

[2주차 총 요약]

- 2주차에는 Python을 이용한 기초적 데이터 분석과 시각화 기법을 배웠다. (with NumPy, Pandas, Matplotlib and Seaborn)

- 비전공자라 몰랐는데, 코드를 공유하고 협업을 통해 코드를 짜는게 생각보다 많이 도움이 되고 재미있다.

 


 


[ 📖 수업 내용 회고 📖]


1. Python 기초 (클래스)

Python의 클래스 개념을 이해하고 활용하는 방법에 대해 학습했습니다. 클래스는 객체 지향 프로그래밍의 핵심 요소로, 복잡한 데이터 구조와 기능을 효율적으로 관리할 수 있게 해줍니다. 수업에서는 클래스 정의, 속성 및 메서드, 상속 등을 다루었습니다.

Python 클래스 예제
class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade
    
    def get_info(self):
        return f"Name: {self.name}, Age: {self.age}, Grade: {self.grade}"

student = Student("John Doe", 20, "A")
print(student.get_info())​
  • 클래스 정의: class Student:를 통해 Student라는 이름의 클래스를 정의
  • 생성자 메서드 '__init__'
    - '__init__(self, name, age, grade) '메서드는 클래스의 생성자(constructor)로, 객체가 생성될 때 자동으로 호출ehla
    - 'self'는 생성된 객체 자신을 참조하며, name, age, grade를 인스턴스 변수로 초기화
  • 인스턴스 메서드 ' get_info': 'get_info(self)' 메서드는 학생의 정보를 문자열로 반환
  • 객체 생성 및 메서드 호출 :
    - 'student = Student("John Doe", 20, "A")'를 통해 'Student' 클래스의 인스턴스를 생성
    - 'print(student.get_info())'를 통해 'get_info' 메서드를 호출하여 학생의 정보를 출력

 

🤔(개인적 후기) 개인적을 클래스와 같이 구조가 여러개 엮이면 정리가 잘 안돼서 어려워 하는 것 같다.

 

❗(유의할 점)

  • self의 사용: 모든 인스턴스 메서드는 첫 번째 매개변수로 self를 받아야 합니다. 이는 해당 메서드가 호출된 객체를 참조하게 합니다.
  • 변수 초기화: 생성자 메서드에서 객체의 초기 상태를 설정하는 것이 중요합니다. 모든 필수적인 인스턴스 변수를 초기화해야 합니다.
  • 문자열 포맷팅: f-string을 사용하여 문자열을 포맷팅하는 방법은 가독성이 높고 사용하기 편리합니다.

 


2. 데이터 분석 with NumPy

NumPy는 고성능 수치 계산을 위한 패키지로, 특히 배열 및 행렬 연산에 유용합니다. 수업에서는 NumPy의 기본 사용법, 배열 생성 및 조작, 수학 및 통계 연산 등을 실습했습니다. 예를 들어, 배열의 합과 평균을 구하는 간단한 코드부터 시작해서 고급 연산까지 다루었습니다​.

NumPy 배열 연산 예제
import numpy as np

scores = np.array([80, 90, 85, 95, 88])
total = np.sum(scores)
average = np.mean(scores)
print(f"Total: {total}, Average: {average}")​
  • 라이브러리 임포트: 'import numpy as np'를 통해 NumPy 라이브러리를 'np'라는 이름으로 임포트함
  • 배열 생성: 'scores = np.array([80, 90, 85, 95, 88])'를 통해 'scores'라는 1차원 배열을 생성
  • 합계 계산: 'total = np.sum(scores)'를 통해 'scores' 배열의 모든 요소를 합산하여 'total' 변수에 저장
  • 평균 계산: 'average = np.mean(scores)'를 통해 'scores' 배열의 평균 값을 계산하여 'average' 변수에 저장
  • 결과 출력: 'print(f"Total: {total}, Average: {average}")'를 통해 합계와 평균을 출력

 

🤔(개인적 후기) 코딩으로 수학 문제를 풀어본 적이 없어서, 코드를 통해 수학 연산 자체를 표현하는 과정이 헷갈렸다. 지속적 연습이 필요해 보인다.

 

❗(유의할 점)

  • 배열 생성: NumPy 배열은 리스트나 튜플과는 다르게 연산이 가능하며, 데이터 타입이 일관되게 유지된다.
  • 타입 유의: NumPy 배열은 특정 데이터 타입을 갖기 때문에, 배열에 저장되는 모든 요소는 동일한 타입을 갖습니다. 이를 통해 연산이 최적화된다.

 


3. 데이터 분석 with Pandas

Pandas는 데이터 조작 및 분석에 매우 유용한 라이브러리입니다. Pandas를 사용하면 데이터 프레임을 통해 대용량 데이터를 효율적으로 처리하고 분석할 수 있습니다. 수업에서는 데이터 프레임 생성, 데이터 정렬 및 필터링, 그룹화 및 집계 등의 기능을 학습했습니다. 또한, 실습을 통해 데이터 전처리와 변환 작업을 수행했습니다.

Pandas 데이터 프레임 예제
import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'Score': [85, 90, 95]
}
df = pd.DataFrame(data)
print(df)

df_sorted = df.sort_values(by='Age', ascending=False)
print(df_sorted)​
  • 라이브러리 임포트: import pandas as pd를 통해 Pandas 라이브러리를 pd라는 이름으로 임포트
  • 데이터 딕셔너리 생성: data라는 딕셔너리를 생성하여 세 개의 키('Name', 'Age', 'Score')와 각각의 값을 리스트 형태로 정의
  • 데이터 프레임 생성:
    - df = pd.DataFrame(data)를 통해 data 딕셔너리를 바탕으로 데이터 프레임 df를 생성
    - print(df)를 통해 데이터 프레임을 출력하여 생성된 내용을 확인
  • 데이터 프레임 정렬:
    - df_sorted = df.sort_values(by='Age', ascending=False)를 통해 df 데이터 프레임을 'Age' 컬럼을 기준으로 내림차순으로 정렬하여 df_sorted에 저장
    - print(df_sorted)를 통해 정렬된 데이터 프레임을 출력

 

🤔(개인적 후기) 슬슬 빅분기 공부를 하던 범위가 나오고 있다. 😌 드디어 머리가 조금은 쉴 수 있다. 🤗 

 

❗(유의할 점)

  • 데이터 일관성: 데이터 프레임을 생성할 때, 각 컬럼의 리스트는 동일한 길이를 가져야 합니다. 그렇지 않으면 ValueError가 발생합니다.
  • 정렬 기준:
    • sort_values 메서드를 사용할 때 by 파라미터에 정렬 기준이 되는 컬럼 이름을 지정합니다.
    • ascending 파라미터를 False로 설정하면 내림차순으로 정렬되며, 기본값은 True로 오름차순 정렬입니다.
  • 데이터 변경:
    • sort_values 메서드는 원본 데이터 프레임을 변경하지 않고 정렬된 새로운 데이터 프레임을 반환합니다. 원본 데이터 프레임을 변경하려면 inplace=True 파라미터를 사용할 수 있습니다.
# 데이터 프레임을 나이(Age) 기준으로 내림차순 정렬, 원본 데이터 프레임에 바로 변경
df.sort_values(by='Age', ascending=False, inplace=True)

 

 


4. 데이터 시각화 with Matplotlib and Seaborn

[ Matplotlib ]

Matplotlib는 다양한 시각화 기능을 제공하는 라이브러리로, 데이터의 분포와 관계를 직관적으로 파악할 수 있게 해줍니다. 수업에서는 기본적인 선 그래프, 막대 그래프, 히스토그램, 산점도 등을 그리는 방법을 배웠습니다. 또한, 그래프의 스타일과 레이아웃을 설정하는 방법도 학습했습니다 .

Matplotlib 시각화 예제
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
plt.plot(x, y, marker='o')
plt.title("Sample Line Plot")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()​
  • 라이브러리 임포트: import matplotlib.pyplot as plt를 통해 Matplotlib의 pyplot 모듈을 plt라는 이름으로 임포트
  • 데이터 정의: x와 y 리스트를 정의하여 플롯에 사용할 데이터를 준비
  • 라인 플롯 생성:
    - plt.plot(x, y, marker='o')를 통해 x와 y 데이터를 라인 플롯으로 생성
    - marker='o' 옵션을 사용하여 데이터 포인트에 원형 마커를 추가
  • 제목 및 축 레이블 설정:
    - plt.title("Sample Line Plot")를 통해 플롯의 제목을 설정
    - plt.xlabel("X-axis")를 통해 X축의 레이블을 설정
    - plt.ylabel("Y-axis")를 통해 Y축의 레이블을 설정
  • 플롯 표시:
    - plt.show()를 통해 플롯을 화면에 표시

 

🤔(개인적 후기) EDA를 계획할 때, 빠르게 데이터를 파악하는데 도움이 될 것 같다.

 

❗(유의할 점)

  • 데이터 길이 일치: x와 y 리스트의 길이가 같아야 합니다. 그렇지 않으면 ValueError가 발생합니다.
  • 플롯 커스터마이징:
    • plot 함수는 다양한 옵션을 제공하여 라인의 스타일, 색상, 마커 등을 커스터마이징할 수 있습니다.
    • 예를 들어, plt.plot(x, y, color='red', linestyle='--', marker='x')와 같이 사용할 수 있습니다.
  • 한글 폰트 설정:
    • 한글 제목이나 레이블을 사용할 경우 폰트 깨짐 현상이 발생할 수 있습니다. 이 경우 폰트를 설정해주어야 합니다.
    • 예: plt.rc('font', family='NanumGothic')

 

[ Seaborn ]

Seaborn은 Matplotlib를 기반으로 한 고급 시각화 라이브러리로, 통계적 데이터 시각화에 강력한 기능을 제공합니다. 수업에서는 Seaborn의 기본 설정, 다양한 플롯(분포도, 회귀선, 막대 그래프 등) 그리는 방법을 다루었습니다. 특히, 데이터 프레임과의 연계성을 통해 복잡한 데이터 시각화를 쉽게 구현할 수 있었습니다 .

Matplotlib 시각화 예제
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

df = sns.load_dataset("iris")
sns.pairplot(df, hue='species')
plt.show()​
● 라이브러리 임포트:
  - import seaborn as sns를 통해 Seaborn 라이브러리를 sns라는 이름으로 임포트
  - import pandas as pd를 통해 Pandas 라이브러리를 pd라는 이름으로 임포트
  - import matplotlib.pyplot as plt를 통해 Matplotlib의 pyplot 모듈을 plt라는 이름으로 임포트
● 데이터셋 로드: df = sns.load_dataset("iris")를 통해 Seaborn의 내장 데이터셋인 "iris" 데이터를 로드하여 데이터 프레임 df에 저장
● Pair Plot 생성: sns.pairplot(df, hue='species')를 통해 df 데이터 프레임의 각 변수 쌍에 대해 산점도를 그리고, hue='species'를 사용하여 각 종(species)에 따라 색상을 다르게 표시
● 플롯 표시: plt.show()를 통해 생성된 플롯을 화면에 표시

 

🤔(개인적 후기) R을 사용했던 나로서는, 이렇게 상세하게 그래프 안의 내용을 커스터마이징 할 수 있는 점이 매우 유용해 보였다. 위에서 모두 설명하진 못했지만, 실제 수업시간에는 폰트 크기/ 글씨 굵기/ 글씨 회정 등 다양하게 그래프를 커스터마이징 할 수 있는 코드를 배웠다. 예전에 논문을 쓸 때 revision으로 시각화를 조금 더 해달라는 피드백을 받은 적 있는데, 파이썬을 조금 더 잘했더라면 더욱 보기 좋은(시각화가 잘된) 그래프가 완성 되었지 않았을까 생각이 들었다.

 

❗(유의할 점)

  • 데이터셋 로드:
    • Seaborn의 load_dataset 함수는 다양한 내장 데이터셋을 제공합니다. 이 예제에서는 "iris" 데이터셋을 사용합니다.
  • Pair Plot 사용:
    • Pair Plot은 데이터의 모든 변수 쌍에 대해 산점도를 그리기 때문에, 변수의 수가 많으면 플롯이 복잡해질 수 있습니다.
    • hue 파라미터를 사용하면 카테고리 변수에 따라 색상을 다르게 하여 시각적으로 구분할 수 있습니다.
  • 시각화 설정:
    • 필요에 따라 Seaborn과 Matplotlib의 설정을 변경하여 플롯의 스타일, 크기, 색상 등을 커스터마이징할 수 있습니다.

 


결론

Numpy와 Pandas 기초부터 실습예제까지 활용하여 수업이 진행되어 내용을 이해하기에 용이했다. 또한 데이터 시각화를 통해 빠르게 데이터를 파악하고, 그래프를 커스터마이징 할 수 있는 코드를 알려주셔서 향후 시각화가 필요한 업무에 적용 할 수 있을 기회가 있지 않을까 싶다.

 

 


[  ✨ 가장 좋았던 점 ✨ ]


1. 팀 프로젝트 실습

✅ 클래스 생성을 배우고 난 후, 실습으로 팀 단위로 코드를 짜고 코드리뷰를 진행 함

✅ 실습 내용: 마켓컬리의 회원 등급을 모방하여 일반 회원, 프렌즈, 퍼플 회원을 클래스로 구현하고, 각 회원이 제품을 구매할 때의 행동을 코드로 작성 함 (작성한 코드는 아래의 더보기에 있습니다.)

더보기

작성한 코드

클래스 생성
class Product:
    # code: 제품번호, name: 상품명, num: 상품 갯수, price: 상품가격
    def __init__(self, code, name, num, price):
        self.code = code
        self.name = name
        self.num = num
        self.price = price

class Plain:
    # member_id: 회원아이디, name: 이름, point: 적립률, review_point: 더블 적립 여부, stack_point: 누적 적립금
    def __init__(self, member_id, name):
        self.member_id = member_id
        self.name = name
        self.point = 0.005
        self.review_point = False
        self.stack_point = 0

    # 상품 구매시 포인트 적립 및 누적포인트, 더블 후기 가능 여부 출력
    def buy(self, product, num):
        if isinstance(product, Product):

            print(f'{product.name}을(를) 구매하였습니다.{round(product.price * self.point)} 포인트 적립완료')

            self.stack_point += round(product.price * self.point)
            print(f'누적포인트 : {self.stack_point}')

            print(self.double_review)
        else:
            print('바코드를 읽을 수 없습니다.')

    # 더블 후기 가능 여부 판단
    @property
    def double_review(self):
        if self.review_point:
            return '후기 적립금이 두 배로 적립됩니다.'
        else:
            return '후기 적립금은 기본 적립률로 적립됩니다.'

class Friends(Plain):
    # point: 적립률, coupon: 잔여 쿠폰 갯수
    def __init__(self, member_id, name):
        super().__init__(member_id, name)
        self.point = 0.01
        self.coupon = 3

    # 재정의 - 쿠폰 사용 여부 추가
    def buy(self, product, num):
        if isinstance(product, Product):
            print(f'{product.name}을(를) 구매하였습니다.{round(product.price * self.point)} 포인트 적립완료')

            self.stack_point +=round(product.price * self.point)
            print(f'누적포인트 : {self.stack_point}')

            print(self.double_review)

            if self.coupon > 0:
                self.coupon -= 1
                print(f'쿠폰이 1장 사용되었습니다. (남은 쿠폰 : {self.coupon})')
        else:
            print('바코드를 읽을 수 없습니다.')

class Purple(Friends):
    # point: 적립률, coupon: 잔여 쿠폰 갯수, review_point: 더블 적립 여부
    def __init__(self, member_id, name):
        super().__init__(member_id, name)
        self.coupon = 4
        self.point = 0.07
        self.review_point = True # 재정의​

시연을 위한 테스트용 코드

rippie = Product('code0001' ,'립파이', 10, 2000)
ppoddo = Product('code0002' ,'뽀또', 10, 1000)

member1 = Plain('aaa', '짱구')
member2 = Friends('bbb', '짱아')
member3 = Purple('ccc', '철수')​
member1.buy(rippie, 1)
print()
member2.buy(rippie, 1)
print()
member3.buy(rippie, 1)
mogu = '모구모구'
member1.buy(mogu, 1)

👥 (팀 프로젝트 후기) 

  사실 수업시간에 모르는 것에 대한 질문을 많이 해본 상태라, 팀원들과 사이가 좋은 상태였다. (팀원들 짱 착함) 그래서 그런지 정말 자유롭게 의견을 교환하고, 코드를 작성하여 즐겁게 팀프로젝트를 진행 할 수 있었다.

 

  특히, 서로의 백그라운드(경험)가 다른 사람들 끼리 모여서 그런지, 생각의 방향이 다른게 흥미로웠다. 예를 들어, 나는 전략 기획쪽에서 일을해서 그런지 사용자의 시나리오를 생각해보는게 익숙했고, 개발을 하시던 분들은 잘 구조화된 코드를 정말 빠르게 짜고, 나의 아이디어까지 디벨롭한 피드백을 주셨다.

 

  덕분에 개발에 필요한 지식도 얻고, 앞으로의 팀 프로젝트도 기대되는 시간을 가질 수 있었다.


2. 코드 공유

🎙️이 부분에 대해 정말 말하고 싶었다.

✅ 본 수업 과정에서는 아래의 이미지와 같이, 실습 예제를 주면 아래에 각자의 코드를 공유할 수 있도록 엑셀에 마련해 놓았다.

 

✅ 그런데 이게 정말 도움이 많이 된다. 같은 문제에도 정말 다양한 코드가 사용되고, 다양한 백그라운드를 가진 동기들이 있다보니 그 코드의 특성도 다양하다. 

✅ 쉬는 시간마다 동기들의 신기하거나 마음에 드는 코드들을 보면서, 수학의 여러 풀이 방법을 찾아낸듯한 쾌감이 느껴진다. (속마음 🗯️: 동기들 genius!)

 

🎙️ 결론: 코드 공유는 역시 옳다. 


[  🎈  추가 이야기 🎈 ]

초반에 선생님의 도움으로 랜덤으로 동기분들과 매칭되어 밥을 먹었다. 하지만 이제는 마음 맞는 동기분 들끼리 밥을 먹거나, 혼자 먹는 동기분들도 보인다. 각자 편하게 분위기를 즐기고 있는 듯 하다.

나는 김밥펨에 들어갔다. 김밥 조아 🥰 상암동 식후땡 망고 짱맛 🤤
(고망고로 오세여)
동동 꽈배기 완전 겉바속촉 맛있어요 😭
과자가 넘쳐나서 살이 쪗어요.. 😭 종종 들어오셔서 선물을 주고 가시는데, 이번껀 특히 마음에 들었다. 특히 멀티포트와 손풍기!
멀티포트 집에서 당장 쓰는중. 손풍기도 마침 장마철이라 동기들이랑 우산뒤에 신발 넣어놓고 몰래 열심히 말렸따 ㅋㅋㅋㅋㅋ

 

무엇보다 동기들이 너무 착하고 재밌다. 굿뜨 👍

관련글 더보기