- 목표(1) : 수강생들이 가장 많이 혹은 적게 듣는 시간과 요일 찾기
import pandas as pd
sparta_data = pd.read_table('파일경로',sep=',')sparta_data.head()
print(type(sparta_data['access_date'][1])) #데이터의 종류 확인

>>> 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.tail()
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count() #요일별 접속자 수 구하기
weekdata = weekdata.agg(weeks) #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
# 데이터 시각화 해주기
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(10,5)) #그래프 사이즈
plt.bar(weekdata.index, weekdata) #그래프 x축, y축
plt.title('요일별 수강 완료 수강생 수') #그래프 명
plt.xlabel('요일') #x축 라벨
plt.ylabel('수강생(명)') #y축 라벨
plt.xticks(rotation=90) #x축 라벨을 90도 회전
plt.show() #그래프 출력
plt.figure(figsize=(10,5))
plt.plot(hourdata.index, hourdata)
plt.title('시간별 수강 완료 사용자 수')
plt.xlabel('시간')
plt.ylabel('사용자(명)')
plt.xticks(np.arange(24)) #x축 눈금 표시
plt.show()
![]() |
![]() |
# 히트맵으로 시각화 하기
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))
plt.pcolor(sparta_data_pivot_table)
plt.xticks(np.arange(0.5, len(sparta_data_pivot_table.columns), 1), sparta_data_pivot_table.columns)
plt.yticks(np.arange(0.5, len(sparta_data_pivot_table.index), 1), sparta_data_pivot_table.index)
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar() #그래프 옆에 숫자별 색상값 컬러바 표시
plt.show()

>>> 분석 결과 화요일 18시에 접속자가 가장 많은 것을 확인할 수 있다.
- 목표(2) : 수강을 가장 많이 하는 지역 찾기
import pandas as pd
sparta_data = pd.read_table('파일경로',sep=',')sparta_data.head()
category_range = set(sparta_data['area']) #지역 분류 하기
print(category_range, len(category_range))
area_info = sparta_data[['area','latitude','longitude']] #접속지역, 위도, 경도만 있는 테이블 만들기area_info.head()
area_info=area_info.drop_duplicates(['area']) #중복 데이터 삭제
area_info=area_info.sort_values(by=["area"], ascending=[True]) #지정 값 기준으로 데이터 정렬
area_info= area_info.reset_index() #인덱스 재정렬area_info
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
import matplotlib.pyplot as plt #그래프 시각화
import numpy as np
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
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)
m
![]() |
![]() |
>>> 서울 지역 수강생 수가 가장 많고 그 다음으로 대전, 부산 지역 순으로 많이 분포해있다.
type() | 데이터의 타입을 확인하는 함수 | |
str | 문자열 자료형 | |
int | 정수형 | |
float | 실수형 | |
to_datetime() | 해당 열 데이터를 날짜형 데이터로 변환시키는 함수 | |
dt.day_name() | 각 요일의 영어 이름을 출력하는 메소드 | |
dt.hour | 해당 날짜의 시간 값을 가져오는 메소드 | |
agg() | 그룹조건이 여러개가 되는 경우도 있고 한번에 여러 컬럼을 다르게 연산 가능 문자열 같은 경우 join을 이용해 한 줄로 표기 가능 |
|
sort_index() | 데이터 오름차순 정렬 / sort_index(ascending=False) 내림차순 정렬 | |
np.arange(n) | n만큼의 간격으로 배열을 생성 | |
pd.pivot_table | value | 데이터로 사용할 열 |
index | 행 | |
columns | 열 | |
aggfuc | 데이터 집계 함수 | |
set() | 각각의 데이터가 고유한 값을 가지게 되어 중복값을 제거 | |
drop_duplicates() | 중복되는 행을 제거하는 메소드 | |
reset_index() | 설정 인덱스를 제거하고 기본 인덱스(0, 1, 2, ...)로 변경하는 메소드 | |
sort_values | 지정 값을 기준으로 데이터 정렬 | |
by=["a"] | a : 정렬 기준이 될 데이터 | |
ascending=[ ] | True : 오름차순, False : 내림차순 정렬 | |
merge() | 두 테이블을 각 데이터에 존재하는 고유값을 기준으로 병합, SQL의 join 기능 | |
loc[n,"열 이름"] | n번째의 열 조회 |
'Today I Learned' 카테고리의 다른 글
231213 / 데이터 분석 5주차 완강 및 예제 풀이 (0) | 2023.12.13 |
---|---|
231212 / 데이터 분석 4주차 및 예제 풀이 (0) | 2023.12.12 |
231211 / 데이터분석 복습 및 예제 풀이 (0) | 2023.12.11 |
231208 / SQL&Python 예제 풀이 (0) | 2023.12.08 |
231207 / SQL&Python 예제 풀이 (0) | 2023.12.07 |