본문 바로가기

TIL

[231212] Phython: 요일/시간대/지역별 데이터 분석 및 지도 라이브러리 활용법

* 수강 강의명: 데이터 분석 종합반 - 3주차 

 [요약] 

1. 요일/시간대별 데이터 분석 

1)  데이터 전처리 

① 판다스 선언 및 데이터 불러오기 
import pandas as pd
sparta_data = pd.read_table('/content/access_detail.csv', sep=',')

② 날짜 데이터 타입 확인하기 
print(type(sparta_data['access_date'][1]))

# type() 함수를 사용해 데이터의 종류 확인 가능. str은 문자열, 시간은 timestamp로 표기됨
# sparta_date 정보에서 access_date 열에서 데이터 첫번째 부분만 확인 하면 되겠죠?

③ 데이터 포맷 변경하기 
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format=format)
sparta_data['access_date_time_weekday'] = sparta_data['access_date_time'].dt.day_name()
sparta_data['access_date_time_hour'] = sparta_data['access_date_time'].dt.hour
sparta_data.tail(5)

# to_datetime()은 괄호 안, 해당 열의 데이터를 날짜와 시간 데이터로 변경 해주는 함수
# [날짜 컬럼].dt.day_name 은 해당 날짜의 요일을 가져오는 함수
# [날짜 컬럼].dt.hour 은 해당 날짜의 시간을 가져오는 함수

④ 요일/시간대별 수강생 수 구하기
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
weekdata = weekdata.agg(weeks)

hourdata = sparta_data.groupby('access_date_time_hour')['user_id'].count() 
hourdata = hourdata.sort_index()
hourdata 

# groupby(’컬럼명’)은 데이터를 특정 기준으로 그룹화하여 처리 가능
# count() 는 데이터 개수 집계에 활용
# agg(”변수”) 는 데이터를 리스트 순서에 따라 재배열 해주는 함수 

 

2) 데이터 분석 및 시각화 

① matplotlib, numpy 사용 선언하기
import matplotlib.pyplot as plt
import numpy as np

② 막대 그래프 그리기
그래프 사이즈 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()

③ 선 그래프 그리기 (막대그래프와 유사함)
그래프 사이즈 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() 는 괄호에 명시된 가격으로 배열을 생성해주는 함수 

④ 히트맵(Heatmap) 
- X축과 Y축에 변수를 지정하고, 균일할 블록으로 나누어 각 칸에 수치형 변수를 채우는 방식. 데이터 값이 높거나 양이 많은 경우 진한색을, 낮거나 적은 경우 연한색을 사용하여 시각적 패턴을 생성

> 피벗테이블 만들기
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
#values : 값
#index :열에 들어 가는 부분
#columns : 행에 들어가는 부분
#aggfunc : 데이터 값에 사용할 함수

> 히트맵 그래프 생
그래프 사이즈 plt.figure(figsize=(10,5))
pcolor로 히트맵 그리기 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('요')
x축 눈금 표시 plt.xticks(np.arange(24))
그래프 출력 plt.colorbar()
plt.show()

 

2. 지역별 데이터 분석 

① 판다스 선언 및 데이터 불러오기 
import pandas as pd
sparta_data = pd.read_table('/content/students_area_detail.csv',sep = ',')

② 지역 분류하기 
category_range = set(sparta_data['area'])
print(category_range, len(category_range))

#set() 은 데이터 중복 없이 각 데이터의 unique한 값을 출력해오는 함수 
#len() 은 리스트에 들어있는 원소 개수, 즉 리스트의 크기를 숫자로 알려줌 

③ 지역 정보만 추출 (지역명, 위도, 경도) 
area_info=sparta_data[['area','latitude','longitude']]
area_info=area_info.drop_duplicates(['area'])
area_info = area_info.sort_values(by=["area"], ascending=[True])
area_info= area_info.reset_index()

#새로운 테이블을 만들 때는 기존 테이블에서 필요한 열 이름을 대괄호에 넣어서 변수로 지정
#drop_duplicates()는 원하는 컬럼의 중복 데이터를 제거하는 함수 
#.sort_values() 는 지정 값을 기준으로 레이블을 정렬 가능. 정렬 기준은 by=[”정렬 기준이 될 레이블”] 로 표기 
#reset_index() 로 인덱스를 순서대로 재정렬 할 수 있음

④ 각 지역 수강생 수(지역명, 유저 아이디)
number_of_students = pd.DataFrame(sparta_data.groupby('area')['user_id'].count())

⑤ 테이블 합치기 
result = pd.merge(area_info, number_of_students, on="area")
result

#merge() 로 두테이블을 병합할 수 있음 

 

2) 데이터 분석 및 시각화 

① matplotlib, numpy 사용 선언하기
import matplotlib.pyplot as plt
import numpy as np
plt.rc('font', family='NanumBarunGothic')

② 선 그래프 그리기 
plt.figure(figsize=(10,5)) 
plt.plot(result['area'], result['user_id'])
plt.title('지역별 사용자 수')
plt.xlabel('지역')
plt.ylabel('사용자(명)')
plt.xticks(np.arange(13))
plt.show() 

③ 지역별 값을 지도에 표시하기
- 라이브러리 불러오기
import folium
from folium.plugins import MarkerCluster

#폴리움(Folium)은 분석한 데이터의 결과를 지도에 그리기 위한 라이브러리
#마커클러스터(MarkerCluster)는 가까운 거리의 marker를 군집시켜, 해당 건수를 표현해줌

- 대한민국 위도와 경도 설정하기 
m = folium.Map(location=[37.5536067,126.9674308],
zoom_start=7)

- 반복문 활용해서 지도에 지역별 위도와 경도 넣기
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) 

#loc[n,"열 이름"] 은 n번째의 열을 조회하는 함수
 #.add_to(m)은 지정해둔 지도를 가져오는 함수

 

** 그래프에서 한글이 깨진다면 ?

1) 새 코드에서 폰트 설치하기

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
2) Colab 런타임 재시작
3) figure 하단에 하기 코드 입력
plt.rc('font', family='NanumBarunGothic') 

 

[정리]

1) 어떤 문제가 있었나 

2) 내가 시도해본 건 무엇인가

3) 어떻게 해결했나

4) 무엇을 새롭게 알았나

- 파이썬 작성 순서나 흐름을 대략적으로 알 것 같으나 여러 번 복습이 필요할 듯