내일배움 본캠프

[내일배움 본캠프]데이터 분석과 다양한 시각화 방법

hyeon-ji 2026. 5. 13. 19:52

오늘은 문자열 데이터를 날짜형으로 바꾼 후 numpy를 활용하여 연산을 하며 데이터 분석을 진행했다. matplotlib 라이브러리를 사용하여 plot, bar, heatmap 형식으로 시각화하고, 더 나아가 folium, markercluster 라이브러리를 사용하여 지도 형식으로 시각화하는 방법에 대해 학습했다. 


● 데이터 분석 순서

1) 문제 정의 및 가설 설정하기

2) 데이터 분석 기본 세팅 하기

3) 데이터 분석하기

4) 분석 결과 시각화 하기

5) 최종 결론 내리기


▶ 데이터 기본 세팅하기

import pandas as pd
#import --> pandas 불러와줘
#as pd --> 이제부터 pandas를 pd 라고 부를게

sparta_data = pd.read_table('/content/access_detail.csv', sep=',')
sparta_data.head()
● data 이름 지정
● pd.read_table --> pd로 table을 읽어라
● 파일명 우클릭하여 경로 복사
● csv 파일이므로 sep=',' 작성
● head() --> 데이터를 열어서 보여줘라

더보기

● 테이블 이름 해석

lecture_id (수강 강의 id)

access_date (접속 시작 날짜 및 시간)

user_id (유저 id)

 

▶ 데이터 전처리하기

 

type 함수를 사용하여 데이터형 확인기

print(type(1))
print(type("hello"))
print(type(sparta_data["access_date"][0]))
#type 함수를 이용하여 '정수형'인지 '문자형'인지 확인할 수 있다
#int : 정수형
#str : 문자열

 

str형인 access_date 데이터를 fotmat 함수를 사용하여 날짜형으로 바꾸기

format='%Y-%m-%d %H:%M:%S'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format=format, errors='coerce')

print(type(sparta_data["access_date_time"][0]))

sparta_data.tail(5)
● to_datetime --> 괄호 안, 해당 열의 데이터를 날짜와 시간 데이터로 변경 해주는 역할
● <class 'pandas._libs.tslibs.timestamps.Timestamp'> 와 같은 결과가 나온 것을 확인할 수 있다.
  즉, 날짜형으로 바뀐 것을 확인할 수 있다.
● 오른쪽 끝에 access_date_time 열이 추가된 것을 확인할 수 있다.
더보기
  • %Y는 년도
  • %m은 월
  • %d는 일

 

요일 추가하기

sparta_data['access_date_time_weekday'] = sparta_data['access_date_time'].dt.day_name()
sparta_data.tail(5)
● [날짜 컬럼].dt.day_name 으로 해당 날짜의 요일을 가져 올수 있다.

 

▶ 데이터 분석하기

● groupby, count, agg 변수를 이용하여 요일별 접속한 수강생 수 구하기

weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
weekdata
● groupby(’컬럼명’)를 사용하여 데이터를 특정 기준으로 그룹화한다.
● count()을 이용하여 해당 데이터의 개수를 센다.
● agg(”변수”)를 이용하여 ~~하면 "변수 안 데이터 별 합계"를 구할 수 있다.

 

☞ 요일 순서대로 정렬 시키기

weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
weekdata = weekdata.agg(weeks)
weekdata

 

☞  시간 별 접속한 수강생 수 전처리 하기

sparta_data['access_date_time_hour'] = sparta_data['access_date_time'].dt.hour

hourdata = sparta_data.groupby('access_date_time_hour')['user_id'].count()
hourdata = hourdata.sort_index()
hourdata
[날짜 컬럼].dt.hour 을 사용하여 해당 날짜의 시간 값을 가져오기
sort_index()를 사용하여 해당 데이터를 오름차순(ascending)으로 정렬 하기
반대로, 내림차순(descending)을 하고 싶다면, 'sort_index(ascending=False)'으로 설정 가능

 

● 지역 분류하기

category_range = set(sparta_data['area'])
print(category_range, len(category_range))
● set() 은 데이터의 .중.복.없.이. 각각의 데이터가 unique한 값을 가질 수 있게 한다. 즉, 중복값을 제거할 수 있다.
● len() 은 list에 들어가 있는 원소 개수, 즉 리스트의 크기를 알려주는 함수이다.

 

● 필요한 데이터만 볼 수 있게 table 가공하기

area_info=sparta_data[['area','latitude','longitude']]
area_info=area_info.drop_duplicates(['area'])
area_info= area_info.reset_index()
area_info = area_info.sort_values(by=["area"], ascending=[True])
area_info
● 'area_info' 를 사용하여 원하는 데이터만으로 이루어진 테이블 만들기가 가능하다.
새로운 테이블을 만들 시, 기존의 테이블에서 필요한 "열의 이름"을 대괄호에 넣어 변수에 지정해 준다.
● drop_duplicates()을 이용하여 area 컬럼의 중복 데이터를 처리한다.
● '.reset_index()'를 이용하여 인덱스를 재정렬한다.
● '.sort_values'를 통해 지정 값을 기준으로 레이블을 정렬할 수 있다.
● 'br=["정렬 기준이 될 레이블"]
● 'ascending=[True}' True면 오름차순, False면 내림차순

 

● 그룹별 수 구하기 + 기존 테이블과 합치기

number_of_students = pd.DataFrame(sparta_data.groupby('area')['user_id'].count())
number_of_students

result = pd.merge(area_info, number_of_students, on="area")
result
● 'groupby'를 이용하여 그룹을 설정한다.
● 'count()'를 이용하여 개수를 센다.
● 'merge()'를 이용하여 두 테이블을 병합한다.

matplotlib, numpy 사용하여 가장 적절한 고객 관리 타이밍 분석 및 시각화하기

 

요일별 수강생 수 바 그래프 그리기

#그래프 사이즈
plt.figure(figsize=(10,5))

#그래프 x축 y축
plt.bar(weekdata.index, weekdata)

#그래프 명
plt.title('요일별 수강 완료 수강생 수')

#그래프 x축 레이블
plt.xlabel('요일')

#그래프 y축 레이블
plt.ylabel('수강생(명)')

#x축 레이블을 90도로 변환 
plt.xticks(rotation=90)

#그래프 출력
plt.show()

위에 코드를 입력하고 결과를 확인했더니 한글이 보이지 않았다!

 

  한글이 보이지 않을 때 해결 방법

더보기

● 한글이 보이지 않을 때 해결 방법!

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

해당 코드를 입력하고 실행한 후, Colab의 런타임>세션 다시 시작을 누른다.

figure 코드 입력 줄 아래에 아래의 코드를 입력한 후 실행한다.

plt.rc('font', family='NanumBarunGothic')

한글이 정상적으로 입력된 것을 확인할 수 있다!

→ 수강 완료 수강생 수가 화요일이 가장 많고, 두 번째로 일요일이 가장 많다는 것을 알 수 있다!

 

● 시간 별 접속 하는 수강생 수의 라인 그래프(꺾은선 그래프) 그리기

#그래프 사이즈 변경
plt.figure(figsize=(10,5))

#그래프 x축 y축
plt.plot(hourdata.index, hourdata)

#그래프 명
plt.title('시간별 수강 완료 사용자 수')

#그래프 x축 레이블
plt.xlabel('시간')

#그래프 y축 레이블
plt.ylabel('사용자(명)')

#x축 눈금 표시 하기
plt.xticks(np.arange(24))

#그래프 출력
plt.show()
np.arange()는 괄호에 명시된 간격으로 배열을 생성 해주는 함수이다.

→ 6시에 수강 완료 사용자 수가 가장 많다는 것을 알 수 있다!

 

요일 별 접속 시간 살펴보기 그리고 히트맵으로 나타내기

sparta_data_pivot_table = pd.pivot_table(sparta_data, values='user_id',
                       index=['access_date_time_weekday'],
                       columns=['access_date_time_hour'],
                       aggfunc="count").agg(weeks)
sparta_data_pivot_table

#그래프 사이즈 변경
plt.figure(figsize=(14,5))

#pcolor를 이용하여 heatmap 그리기
plt.pcolor(sparta_data_pivot_table)

#히트맵에서의 x축
plt.xticks(np.arange(0.5, len(sparta_data_pivot_table.columns), 1), sparta_data_pivot_table.columns)

#히트맵에서의 y축
plt.yticks(np.arange(0.5, len(sparta_data_pivot_table.index), 1), sparta_data_pivot_table.index)

#그래프 명
plt.title('요일별 종료 시간 히트맵')

#그래프 x축 레이블
plt.xlabel('시간')

#그래프 y축 레이블
plt.ylabel('요일')

#plt.colorbar() 명령어를 추가하면 그래프 옆에 숫자별 색상값을 나타내는 컬러바를 보여 줍니다
plt.colorbar()
plt.show()
> 피벗테이블 만들기
● columns : 열에 들어 가는 부분
● index : 행에 들어가는 부분
● aggfunc : 데이터 축약 시 사용할 함수

→ 화요일 6시에 제일 접속량이 많다는 것을 알 수 있다!

 

지도로 시각화하기

import folium
from folium.plugins import MarkerCluster

#대한민국 위도, 경도 설정
m = folium.Map(location=[37.5536067,126.9674308],
               zoom_start=11) 
m

for n in result.index:
  radius = result.loc[n,'user_id']
  folium.CircleMarker([result['latitude'][n],result['longitude'][n]],
                        radius = radius/50, fill=True).add_to(m)
m
> 지도 라이브러리
● Folium : 분석한 데이터의 결과를 지도에 그리기 위한 라이브러리
● <arkerCluster : 가까운 거리의 marker들을 군집시켜 해당 건수를 표현해준다.

● loc[n,"열 이름"]  => loc[]를 활용하여 n번째의 열을 조회 할수 있다. 
  즉, n번째의 user의 수를 가져 올 수 있다.
● '.add_to(m)'를 활용하여, 지정해 두었던 우리나라의 지도를 가져올 수 있다.


▶ 실습 하기

  요일별 수강완료 수강생 수를 구하여 시각화하기

import pandas as pd
qna_data = pd.read_table('/content/done_detail.csv', sep=',')
qna_data.head()

format='%Y-%m-%d %H:%M:%S'
qna_data['done_date_time'] = pd.to_datetime(qna_data['done_date'], format=format, errors='coerce')

print(type(qna_data["done_date_time"][0]))

qna_data['done_date_time_weekday'] = qna_data['done_date_time'].dt.day_name()

qna_data.tail(5)

weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = qna_data.groupby('done_date_time_weekday')['user_id'].count()
weekdata = weekdata.agg(weeks)
weekdata

import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(10,5))
plt.bar(weekdata.index, weekdata)
plt.title('요일별 수강 완료 수강생 수')
plt.xlabel('요일')
plt.ylabel('수갈생(명)')
plt.xticks(rotation=0)
plt.show()


📅 Day 3. 공정에서 발생할 수 있는 문제 정의하기

1. 공정에서 발생할 수 있는 품질 문제 찾기

공정 단계 발생할 수 있는 품질 문제 원인 가설 확인 가능한 데이터
조립 공정 PCB 납땜 불량, 회로 단선, 조립 불량, 하우징 체결 불량, LED 불량, 이물 혼입 작업자별 조립 편차, 설비 상태 이상, 부품 실장 위치 오차, 리플로우 온도 편차 등 SMT 온도, AOI 검사 결과, 실장 좌표 데이터, 작업자 작업 이력
기능 및 안정성 검사 공정 LED 출력 편차, 과열, 배터리 성능 저하, 충전 불량, 유해물질 기준 초과(RoHS) 전류.전압 조건 이상, 온도 제어 이상, 부품.케이블 내 유해물질 기준 내 초과 가능 등 RoHS 검사 데이터, 전류값, 전압값, 온도 데이터, LED 출력 데이터
후처리 및 외관 공정 코팅 불균일, 스크레치, 도장 불량, 이물, 외관 색상 편차 코팅 점도 변화, 작업 환경 습도 변화, 설비 오염 등 코팅 두께, 습도 데이터, 외관 검사 이미지, 불량 유형 데이터
포장 공정 제품 스크레치, 라벨 오부착, 라벨 오염, 사용 설명서 누락, 포장 스크레치 등 작업자 실수, 자동 포장 컨베어 오작동, 라벨 잉크 번짐 등 포장 검사 결과, 바코드 데이터, 작업자 작업 이력, 불량 유형
더보기
  • 리플로우 : PCB에 부품을 붙이기 위해 납(솔더)을 녹여 고정하는 공정
  • 실장 : PCB 위에 전자부품 배치하고 장착하는 작업
  • SMT 온도 : PCB 표면에 전자부품을 부착하는 기술
  • AOI : 자동 광학 검사. 카메라와 이미지 분석으로 자동 검사

2. 내가 선택한 핵심 품질 문제 항목작성

선택한 공정 기능 및 안정성 검사 공정
정의한 품질 문제 LED 출력 편차, 과열, 배터리 성능 저하, 충전 불량, 유해물질 기준 초과(RoHS)
이 문제가 중요한 이유 홈뷰티 디바이스는 피부에 직접 전기와 열 에너지를 전달하는 제품이기 때문에 출력과 안전성이 기준 범위를 벗어나면 피부 자극, 화상 위험, 제품 효과 저하, 소비자 불만 및 리콜 등의 품질 리스크로 이어질 수 있다.
원인 가설 전류 및 전압 조건 이상, 온도 제어 이상, 부품 및 케이블 내 유해물질 기준 내 초과 가능 등
확인할 수 있는 데이터 RoHS 검사 데이터, 전류값, 전압값, 온도 데이터, LED 출력 데이터
데이터를 분석하면 알 수 있는 것 특정 공정이나 부품 LOT에서 출력 이상 및 과열 문제가 반복되는지 확인할 수 있으며, 불량 원인을 추적하여 공정 조건 최적화, 부품 교체, 품질 기준 개선 등의 대응이 가능하다.

 

3. 문제 정의 문장 만들기

기능 및 안정성 검사 공정에서 [LED 출력 편차, 과열, 배터리 성능 저하, 충전 불량, 유해물질 기준 초과(RoHS)]문제가 발생할 수 있다. 이 문제는 [RoHS 검사 데이터, 전류값, 전압값, 온도 데이터, LED 출력 데이터]를 분석하면 원인을 파악할 수 있을 것 같다.

 


오늘은 월요일, 화요일과 다르게 강의를 수강하는데 시간이 좀 걸렸다. 오늘 배운 내용이 바로바로 이해가 되지 않았기도 했고 좀 어렵다고 느껴졌다. 강의를 먼저 듣고 강의자료를 살펴보고 직접 다시 Colab으로 돌려보면서 이해하려고 했다. 그 과정에서 시간이 좀 걸린 것 같다.

그리고 과제를 풀면서 약간 걱정되는 부분이 생겼다. 강사님께서는 '모든 코드를 외우려고 하지 마라.', '코딩을 아무리 잘하는 사람이라도 모든 코드를 외우고 있기는 힘들다'라고 말씀해 주셔서 그나마 좀 다행이다 싶었는데, 그럼 어느 부분까지 알고 있어야 하는지 걱정이 되었다.

계속 고민하다가 내린 결론은 '코드를 내가 읽었을 때 이 코드가 왜, 어떻게 작성되었는지 이해할 수 있는 정도의 수준까지는 되어야 된다'이다. 그래야 내가 데이터를 분석하기 위해 어느 코드를 사용하여 작성할지 결정내릴 수 있고, 완성된 코드를 읽고 잘 못된 부분은 무엇인지 왜 코드가 이렇게 작성되었는지 알 수 있기 때문이다.