HANCOM AI ACAMEMY/학습일지 🗒️

[스나이퍼팩토리] 한컴AI아카데미 13주차

c'est sunny 2025. 4. 22.

 

 

이번 주는 대용량 데이터를 시각화하여 유의미한 관찰을 하는 법, 그리고 웹크롤링에 대해 배웠다.

pandas, seaborn, matplotlib 등을 불러올 일이 많아서 지피티한테 무슨 차이냐고 물어봤다.

 


 

🐼 1. Pandas: 데이터 다루는 도구 (엑셀 장인 느낌)

"데이터를 불러오고, 가공하고, 분석하는 일" 담당
- 표(테이블) 형태의 데이터를 다룸 (엑셀처럼 행/열로 구성)
- .read_csv(), .groupby(), .pivot_table() 같은 거 다 pandas 기능
- 결측치 처리, 정렬, 필터링, 집계 등 전부 여기서 함

 

📊 2. Matplotlib: 시각화의 뼈대 담당 (그래프 그리는 캔버스 느낌)
"가장 기본적인 시각화 도구" — 선, 막대, 히트맵, 파이차 등 직접 그림 그리는 툴
- plt.plot(), plt.bar(), plt.figure() 같은 함수들
- seaborn이나 다른 시각화 도구들도 결국 matplotlib 위에 얹혀서 돌아감


🖌️ 3. Seaborn: 예쁜 시각화 자동화 도구 (감성 + 똑똑한 스타일)
"matplotlib보다 더 예쁘고 똑똑한 시각화"를 쉽게 만들어주는 도구
- pandas 데이터프레임과 호환 완전 좋음
- 기본 스타일이 깔끔하고, 색상도 예쁘게 잘 나옴
- sns.barplot(), sns.heatmap(), sns.boxplot() 등등

 

✨ 비유로 말하면:

 pandas: 요리 재료 정리해주는 셰프 보조

 matplotlib: 직접 요리하는 도구 (냄비, 프라이팬)

 seaborn: 자동으로 이쁘게 데코도 해주는 고급 조리기구 ✨

 


 

그렇다고 한다.

 

 

이번 주 첫번째 실습시간에는 ' 서울시 공공자전거 대여이력 정보'를 이용해서 데이터분석을 진행하였다.

 

pandas로 데이터 정리 & 전처리

pd.to_datetime(..., errors='coerce'): 날짜 변환 시 잘못된 값은 NaT로 처리
len(df): 전체 행 개수 확인
value_counts(): 특정 열에서 값별 개수 확인
df['성별'].replace({'f': 'F', 'm': 'M'}): 값 소문자 → 대문자 치환
df[df['생년'].astype(int) <= 2020]: 2020년 이후 태어난 사람 필터링
.dt.hour, .dt.day_name(): 날짜에서 시간과 요일 추출


그룹별 분석

df.groupby('성별')['이용시간(분)'].mean(): 성별 평균 이용시간
df.groupby(['성별', '연령대'])['이용시간(분)'].mean(): 성별+연령대 조합별 평균 이용시간
.value_counts(): 요일별 대여 건수 확인

 

pivot_table 구성 요소 정리

index: 행 기준 그룹
columns: 열 기준 그룹
values: 실제로 계산할 대상 데이터
aggfunc: 그룹값 집계 방법 (count, mean, sum, ...) (+ aggfunc='count'일 땐 values에 아무 열 넣어도 동일한 결과!)

 

 

일반 그래프 시각화

# 시각화
이용자수.plot(kind='bar', color='salmon', figsize=(8,5))

plt.title('요일별 대여 건수')
plt.xlabel('요일')
plt.ylabel('이용 건수')
plt.grid(axis='y', linestyle='--', alpha=0.6)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

 

이거는 요일별로 대여건수를 찾아본 건데 예상대로 월요일이 많았다.

그냥 이날 출근하는 사람이 많아서 그런듯 지하철도 월요일이 사람 제일 많음 ㄱ- 

 

 

Heatmap으로 시각화

# 피벗테이블로 요일-시간대별 대여 건수 계산
heatmap_data = df.pivot_table(index='H대여일시', columns='H요일', values='대여일시', aggfunc='count')
# index => y축, columns = x축, values = 값 계산할 기준 열 aggfunc = 값을 어떻게 계산할지 함수

# 시각화
plt.figure(figsize=(8, 5)) # 전체 그림 크기 설정 : (가로길이, 세로길이)
sns.heatmap(heatmap_data, cmap='YlGnBu', annot=True, fmt=".0f") 
# cmap : 색깔, annot : 각 칸에 숫자 표시, fmt : 숫자 포맷

plt.title('요일 + 시간대별 대여 건수 Heatmap')
plt.xlabel('요일')
plt.ylabel('대여시간 (시)')
plt.tight_layout()
plt.show()

 

이건 heatmap써서 데이터 시각화해본 거임

가장 밀도가 높은 시간대가 7-8, 18-19네 추측이 맞았구랴 ㅋ 사실 누구나 할 수 있는 추측이긴 함

 

 

 

두번째 실습시간에는 드디어 웹 크롤링을 진행하였음

 

난 금요일에 휴가를 써서 목요일에 미리 내가 관심있는 주제로 크롤링을 했다. 난 전시를 보러 다니는 걸 좋아해서(아마) 미술관 홈피를 찾아다니다가 환기미술관이 적절해보여서 그 사이트를 이용했다. 관계자분께 양해말씀 드림

 

텍스트 크롤링

 

잘 됐죠 ? 미술작품이 아니라 출판목록을 크롤링한 게 함정이긴 한데 어쨌든 미술관이니까 ㅋ 

 

이미지 크롤링

count = 0
for img in images[:18]:
    src = img.get('src')
    print(src)

    if not src.endswith('svg'):
        img_data = requests.get(src).content
        with open(f'books/book_{count}.jpg', 'wb') as f:
            f.write(img_data)
        print(f"Saved book_{count}.jpg")
        count += 1
    if count == 17:

 

이미지 크롤링과 테이블 크롤링도 이어서 했다.

폴더에 이미지를 잘 불러왔다.

데이터분석보단 크롤링이 재밌구나 난 프로젝트 때 노가다 하는 걸로? 

 

 

 

 

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.

 

 

댓글