본문 바로가기

Today I Learned

+ 데이터 분석 3주차 복습

- 목표(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번째의 열 조회