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

God menu·2025년 6월 23일

<6/16 23일차>

저번 수업 마지막에는 배열의 인덱싱과 슬라이싱 연습문제를 푸는 것으로 마무리했는데 마무리 못한 동기들이 있어서 강사님과 함께 문제 답을 맞춰갔다.

  • 불리언 인덱싱(Boolean Indexing)
    조건식을 이용해 True 또는 False로 이루어진 배열을 만들어, 원하는 조건에 해당하는 값만 추출한다.
  • 필터(마스킹, Masking)
    불리언 인덱싱과 거의 같은 개념으로 조건을 마스크(mask)처럼 씌워서 데이터를 걸러낸다.
  • 팬시 인덱싱(Fancy Indexing)
    정수 배열이나 리스트를 이용해 특정 인덱스의 값을 여러 개 뽑아낸다.
data = np.arange(28).reshape(7,4)
name = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data[name == 'Bob']

▶ array([[0, 1, 2, 3],
    [12, 13, 14, 15]])

mask = (name == 'Bob') | (name == 'Will')
data[mask]

▶ array([[ 0, 1, 2, 3],
    [ 8, 9, 10, 11],
    [12, 13, 14, 15],
    [16, 17, 18, 19]])

arr = np.empty((8,4))
for i in range(8):
    arr[i] = i
arr[[1,5,7,2], [0,3,1,2]]

▶ array([1., 5., 7., 2.])

위처럼 쉬운 코드들을 입력해보며 넘파이의 고급 인덱싱 기법에 대해 알 수 있었다.

넘파이는 이정도로 마무리하고 오후에는 판다스(Pandas)에 대하여 배우기 시작했다.

판다스(Pandas)
표(table) 형식의 데이터를 쉽게 다루고 분석할 수 있게 해주는 파이썬 라이브러리로 데이터 분석 필수 라이브러리이다.

판다스 데이터의 핵심 구조는 시리즈(Series)와 데이터프레임(DataFrame)이 있다.

  • Series : 인덱스-값 쌍으로 구성된 1차원 배열로, 딕셔너리와 유사한 구조를 가짐
  • DataFrame : 여러 Series를 모아놓은 2차원 테이블 구조로, 데이터베이스의 테이블과 유사함

Series는 pd.Series(data, index=index)구문으로 생성한다.

시리즈는 문자열 인덱스를 사용할 수 있고, 데이터에 의미 있는 label을 부여해 직관적인 데이터 접근이 가능하다.

DataFrame은 pd.DataFrame(data, index=[행이름], columns=[열이름])구문으로 생성한다.

데이터프레임을 CSV파일로 저장하고 불러오는 함수는 to_csv() / read_csv(),
캡슐화된 데이터를 빠르게 저장하고 불러오는 함수는 to_pickle() / read_pickle()
가 있고, 데이터프레임 행과 열에 접근하는 인덱싱은 라벨 기반 인덱싱 loc[]과 숫자 기반 인덱싱iloc[]이 있다.

데이터프레임은 미리보기 기능이 있다.

  • head() : 데이터프레임의 처음 5개 행을 보여준다(매개변수로 다른 숫자 지정 가능)
  • tail() : 데이터프레임의 마지막 5개 행을 보여준다
  • info() : 데이터프레임의 기본 정보(행/열 개수, 데이터 타입, 메모리 사용량 등)를 표시
  • describe() : 수치형 열에 대한 요약 통계량(평균, 표준편차, 최소/최대값 등)을 계산

수업 마지막에는 강사님께서 주신 데이터프레임 연습문제를 풀었다. 아마 내일 수업은 데이터프레임 연습문제를 강사님과 함께 답을 맞혀보는 것으로 시작할 예정이다. 처음 실습 코드에서 행에 접근할 때 loc[]를 쓰다가 왜 갑자기 어떤 때는 iloc[]를 쓰는 건지 감이 잘 오지 않았는데, 직접 코드를 입력해 보며 하나씩 실행해 보니까 이해가 쉬웠다. 데이터를 저장하고, 불러오고, 필요한 값만 꺼내는 과정들이 나중에 프로젝트할 때 반드시 필요한 개념인 것 같다. 날씨가 비도 오고 많이 습해서인지 집중력이 조금 떨어지는 순간이 있었는데 다시 정신 차리고 집중하는 힘을 길러야 할 것 같다. 🤣


<6/17 24일차>

어제 수업 마지막에 강사님께서 넘파이 관련 연습문제들을 올려주셔서 오늘 오자마자 해당 연습문제들을 푸는 시간을 가졌다. 그리고 하루종일 판다스에 대해 배우고 코딩하는 수업이었다.

먼저 데이터프레임에서 인덱싱과 슬라이싱하고 행과 열 추가, 삭제에 대해 연습하였다. 인덱싱과 슬라이싱은 기존 리스트에서 하던 것과 다르지 않아서 크게 어렵지 않았고 어제 배운 loc[]와 iloc[]만 신경 쓰면 된다.

import pandas as pd
sci1 = pd.DataFrame({
        "Name": ["Rosaline Franklin", "William Gosset"],
        "Occupation": ["Chemist", "Statistician"],
        "Born": ["1920-07-25", "1876-06-13"],
        "Died": ["1958-04-16", "1937-10-16"],
        "Age": [37, 61],
})

sci1.iloc[:,2:4]

▶  Born    Died
 0 1920-07-25 1958-04-16
 1 1876-06-13 1937-10-16
로 Born과 Died만 추출할 수 있다.

data = {
    '이름': ['김철수', '이영희', '박민수', '정수진', '최영호', '한미래', '윤지원'],
    '나이': [25, 28, 22, 31, 27, 24, 29],
    '점수': [85, 92, 78, 95, 88, 73, 91]
}
df = pd.DataFrame(data)

df.loc[7] = ['홍길동', 30, 70]   # 새로운 행 추가
df['grade'] = ['B', 'A', 'C', 'A', 'B', 'C', 'A', 'C']   # 새로운 열 추가
df.rename(columns={'grade':'등급'}, inplace=True)   #"등급"으로 열 이름 변경
df

▶ 이름  나이 점수 등급
 0 김철수 25  85  B
 1 이영희 28  92  A
 2 박민수 22  78  C
 3 정수진 31  95  A
 4 최영호 27  88  B
 5 한미래 24  73  C
 6 윤지원 29  91  A
 7 홍길동 30  70  C

해당 데이터프레임에서 student_id를 추가하였고 등급을 삭제하였다.


직접 할당하여 추가할 수 있고 insert() 메서드를 사용해 추가할 수 있다. 새로운 열을 추가할 때는 기존 데이터프레임의 행 개수와 동일한 길이의 데이터를 제공해야 한다.

삭제할 때는 drop() 메서드를 사용하고, inplace=True를 설정하면 원본 데이터프레임을 직접 수정할 수 있다.

파일 처리란 텍스트, CSV, 로그 등 외부 파일의 내용을 읽고 쓰는 작업을 의미한다. 파이썬에서는 open()함수와 close()함수를 사용한다.

모드설명파일 없을 때
r읽기 모드 (기본값)오류 발생
w쓰기 모드새로 생성
a이어쓰기 모드새로 생성
x배타적 생성 모드새로 생성
r+읽기/쓰기 모드오류 발생
w+읽기/쓰기 모드 (파일 내용 초기화)새로 생성
a+읽기/이어쓰기 모드새로 생성
>  추가적인 모드 옵션 :
- "t" : 텍스트 모드(기본값). 예 : "rt", "wt"
- "b" : 바이너리 모드. 예 : "rb", "wb"

문법 자체는 생각보다 복잡하지 않았지만 의미를 정확히 이해하지 못하면 헷갈릴 수 있겠다는 생각이 들었다. read_csv()로 불러온 파일의 첫 줄이 컬럼명이 아니었어서 컬럼명을 다시 달아주기도 했다. 완전 익숙하지 않아서 응용된 문제를 접하면 스스로 코드를 짜기보다는 검색이나 도움을 받아야 한다는 점이 나의 부족한 점으로 다가왔다. 강의자료나 연습문제를 보면서 원리를 이해하려고 노력해야겠다. 내일은 강사님께서 올려주신 판다스 연습문제를 풀어볼 예정이다. 연습문제 풀면서 판다스에 대해 더욱 이해하는 시간이 되었으면 좋겠다.


<6/18 25일차>

판다스 연습문제(과제)가 넘파이 연습문제보다 난이도가 체감상 좀 더 높았던 것 같다.

Tidy Data는 데이터를 정리된(분석하기 좋은) 형식으로 구성한 상태를 말한다. 오늘은 Tidy Data를 만드는 두 가지 함수에 대해 실습했다.

  • pd.melt() : wide 형태의 데이터를 long 형태로 변환하는 함수
  • pd.pivot_table() : 범주형 데이터로 그룹을 나누고, 그룹별로 수치형 데이터를 요약하는 함수
billboard_df 데이터프레임에 melt()함수를 적용해서 Tidy Data로 만들어보았다. 이번에는 pivot_table()함수를 사용해보았다. weather 데이터프레임에서 melt()함수로 column을 'day'와 'temp'로 설정하고 pivot_table()함수로 새로운 형태의 데이터프레임을 만들어보았다. 이후 reset_index()함수로 보기좋게 정렬했다.

데이터프레임끼리 결합하기 위해서는 concat()함수를 사용한다. 결합하려는 데이터프레임들의 column이 동일해야하고 axis=0 혹은 1로 주어서 행, 열로 연결할 수 있다. 합칠 때 공통된 인덱스 또는 column만 기준으로 합치고싶다면 join='inner'를 입력해주면 된다.

merge()함수는 두 개의 데이터프레임을 특정 기준을 두고 그 기준으로 합쳐주는 함수이다.
pd.merge(left, right, on='공통열')가 기본 문법이고 how 매개변수로 어떤 방식으로 합칠지 기준을 적어줄 수 있다.

데이터가 눈에 보기에는 깔끔해 보여도 분석에 적합하지 않은 형태가 많다는 걸 알게 되었고, 데이터를 ‘사람이 보기 좋은 형태’가 아니라 ‘분석하기 좋은 형태’로 정리하는 방법을 익히는 것이 중요하다는 것을 깨달았다. 또한, 여러 개의 데이터프레임을 다룰 때 사용하는 concat()과 merge()도 매우 유용하다는 걸 알게 되었다. 특히 merge()는 SQL의 JOIN 개념과 비슷하다고 하셔서 나중에 SQL배울 때 다시 접할 개념이 될 것 같다. 내일은 특강이 있는 날이라서 수업에 대한 부담을 좀 덜고 편하게 수업 들을 예정이다.


<6/19 26일차>

오늘은 특강이 있는 날이었다. 인성검사의 중요성에 대해 강조해 주셨고, 무엇보다 내가 무엇을 배웠는지, 어떤 생각을 했는지를 가능한 많이 기록하고 정리하는 습관이 중요하다는 말씀을 들었다.

또한, 멘탈 관리 역시 중요한 요소로, 꾸준한 자기 점검과 안정적인 생활 패턴이 필요함을 느꼈다. 지금 수업 듣는 것도 마찬가지지만 앞으로 평소에도 재직자 기준의 일상 루틴(9 to 6) 시간에 익숙해지는 노력을 해야겠다는 생각이 들었다.

내가 앞으로 어떤 역량을 더 키워야 할지 감이 잡혀서 동기부여가 되는 시간이었다.


<6/20 27일차>

오늘도 판다스에 대해서 배우는 날이다.

우선 결측치(np.nan / pd.NA)에 대하여 실습했다. 결측치가 있는지 보려면 isna()함수나 isnull()함수로 볼 수 있고 True라고 뜨면 해당 부분에 결측값이 있다는 뜻이다. 결측치를 제거하는 방법으로는 dropna()함수를 쓸 수 있다.

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'age': [25, np.nan, 30, 22, np.nan],
    'score': [90, 85, np.nan, 88, 95],
    'city': ['Seoul', 'Busan', np.nan, 'Incheon', 'Seoul']
}

df = pd.DataFrame(data)

df.dropna(subset=['score'])

위 코드의 결과는 아래처럼 나온다.

subset으로 지정한 'score' 열에 결측치가 있는 행을 drop한다.

결측값을 무조건 drop할 필요 없이 다른 유의미한 값으로 채우기도 한다. 0으로 채울수도 있고 보통은 평균값(mean), 중앙값(median), 최빈값(mode)으로 채운다. 또는 이웃값(ffill 혹은 bfill)으로 대체하기도 한다.

강사님께서 전처리 관련 연습문제들을 몇 개 올려주셔서 풀어보고 답을 맞춰보는 시간을 가졌다. 마지막 문제에서 원핫인코딩을 다루었는데 원핫인코딩(One-Hot-Encoding)이란 범주형 데이터를 0과 1로 변환하는 방식이다.

전처리 관련 실습 후에는 시각화에 대하여 배웠다.

Matplotlib이란 파이썬의 데이터 시각화를 위한 핵심 도구이다. 차트의 종류로는 Line, Scatter, Bar 차트 등이 있으며 데이터 분석에서 시각화는 데이터를 한눈에 파악하기 쉽고, 어떤 컬럼이 영향을 주는 지나 모델 결과에 대해 설명하는 등 필수적이라고 말할 수 있다.


시각화하여 그래프를 그릴 때 xlabel()과 ylabel()을 사용해 각각의 축 이름을 지정할 수 있다. 또한 kind= 옵션으로 그래프의 종류를 선택할 수 있고, bins= 옵션은 히스토그램(histogram)에서 구간(막대)의 개수를 지정할 때 사용된다.


차트에 시각적 옵션(marker, color 등)을 줌으로써 직관적이고 가시성이 향상되게 한다.

결측치 처리는 단순히 결측값을 제거하는 것이 아닌, 데이터의 특성과 분석 목적에 따라 적절하게 대체할 줄 알아야 하고, 대체할 때에는 어떤 방식이 최선인지 고민하는 것이 중요하다.

시각화(Matplotlib)는 데이터프레임으로만 봤을 때는 잘 와닿지 않던 것들도, 시각적으로 나타내니 직관적이게 파악할 수 있었다. 그래프에 적절한 옵션을 주며 가독성이 좋아지게 하는 것이 나중에 프로젝트 결과물에서 중요하게 작용할 것이다. 그러나 코드를 따라 치며 실습할 때는 이해했지만, 스스로 코드를 짜보는 데에는 아직 어려움이 있었다.


단순히 명령어를 외우는 것이 아니라 데이터를 어떻게 다루고 추출할 수 있는지에 대해 배울 수 있어서 흥미로웠다. 데이터를 다루는 일이 생각보다 섬세하고 논리적인 흐름을 요구한다는 걸 알 수 있었고 앞으로 진행될 프로젝트에서도 이제껏 배운 파일 입출력, 전처리, 시각화 등을 적극적으로 활용해서 의미 있는 결과를 도출해내고 싶다.

아직 프로젝트 팀과 주제가 확정된 것이 아니지만 어떤 주제를 하게 되더라도 열심히 해서 내 역량을 끌어올리고, 팀 협업 능력을 키우며, 나의 포트폴리오도 풍부하게 채워나가고 싶다. 😎

0개의 댓글