오늘 배운것
[미션1]
가장 적절한 고객 관리 타이밍 분석하기
우선 우리가 봐야할 데이터 입니다.

User Id와 access_date로 언제 접속률이 많은지 알 수 있습니다.
참고로 저렇게 엑셀을 열어봐도 되지만
| sparta_data.head() |
이렇게 위에 몇가지 데이터만 코딩데이터에서 불러와주어 데이터를 확인할 수 있습니다.
|
import pandas as pd
sparta_data = pd.read_table('/content/access_detail.csv', sep=',')
|
|
print(type(sparta_data['access_date'][0]))
|
그리고 type 함수를 이용해 데이터의 종류를 확인해 줍니다.

그러면 이런식으로 문자열이라고 나타나는데 이걸 날짜형식으로 바꿔줘야 합니다.
|
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format='mixed')
|
날짜형식으로 바꾸는 방법입니다.
to_datetime() 은 괄호안 해당열의 데이터를 날짜와 시간데이터로 변경 해주는 명령어입니다.
그리고 그 안에 format='mixed'는 자동으로 날짜형식을 인식하는 의미라고 합니다.

이렇게 명령어를 써주게 되면 위와 같이 access_date_time이라는 새로은 컬럼이 형성되게 됩니다.
여기서 요일만 따로 뽑아봅시다.
우선 요일과 접속시간 컬럼을 만들어줍니다.
|
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
|

위와같이 데이터에 요일 컬럼과 시간 컬럼이 생성됩니다.
그리고 요일별 접속 수를 알기위해서
| weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count() weekdata |
아래와 같은 코드를 붙여주면 되는데 여기서
groupby는 접속 요일별로 묶어준다음 ['user_id'] count()를 이용하여 아이디의 숫자를 세준 것입니다.
맨위에 weeks 부분 인덱스는 일단 똑같은 결과가 나오는데 이는 그래프 그릴때 쓰기 위해서 입니다.

이런 결과가 나오게 됩니다.
똑같이 시간축을 그리기위해 코드를 입력해줍니다.
|
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
|
우선 위 2개 라이브러리를 불러와줍니다. 메플로립은 차트를 그리는 라이브러리고 numpy는 숫자계산을 도와주는 라이브러리 입니다.
이렇게 코드를 입력해주면

요런 차트가 완성됩니다.
그리고 꺽은선 그래프를 만들고 싶다면

이렇게 plt.bar를 plt.rc로 바꿔주면 됩니다.
그리고 히트맵을 나타내기 위해 피벗테이블을 만들어 줍니다.

그러면 요렇게 피벗테이블이 만들어 집니다.
그리고 그래프를 코드를 넣어주면

여기서 np.arange()는 숫자를 나열해주는 명령어입니다.

이렇게 되면 요일별 몇시쯤에 종료가 가장많이 되었는지 알 수 있겠죠.
[미션2]
목표 : 가장 수강을 많이 하는 지역을 데이터분석으로 찾기
우선 데이터를 확인해보겠습니다.
|
import pandas as pd
sparta_data = pd.read_table('/content/students_area_detail.csv',sep=',')
sparta_data.head()
|

학생 아이디와 지역아이디가 핵심인것 같습니다.
그리고 지역을 분류해줘야 합니다.
|
category_range = set(sparta_data['area'])
print(category_range, len(category_range))
|
이렇게하면

다음과 같이 12가지의 지역이 나오게 됩니다.
set()은 ()안의 데이터를 중복없이 나타내주는 명령어 입니다.
여기서 len은 알다시피 지역의 숫자를 세주게 됩니다.
그러면 지역별로 수강생수를 세주어야겠죠
그리고 지역별 경도와 위도를 뽑아보도록 하겠습니다.
필요한 데이터를 뽑아주기 위해선 지역,경도,위도 테이블을 새로 만들어주기위해
|
#새로운 테이블을 만들고자 할 땐 기존의 테이블에서 필요한 "열의 이름"을 대괄호에 넣어 변수에 지정해 주면 됩니다
area_info=sparta_data[['area','latitude','longitude']]
#잘 만들어졌는지 초기 5개의 데이터 확인하기
area_info.head()
|

이 코드를 추가해주면 다음과 같이 나타나게 됩니다. 이제 중복되는 지역을 제거해서 지역별 경도와 위도를 뽑아내겠습니다.
|
#drop_duplicates()을 이용하면, area(지역) 컬럼의 중복 데이터를 처리 할 수 있습니다. :)
area_info=area_info.drop_duplicates(['area'])
area_info
|
drop_duplicates([]) 명령어를 이용해 중복된 정보를 제거합니다.

우리가 필요한 12가지 지역별 경도 위도가 뽑히게 됩니다.
그리고 원래 인덱스를 재정렬 해주면
|
#.reset_index()를 이용해, 인덱스를 재정렬 할 수 있어요!
area_info= area_info.reset_index()
area_info
|

|
area_info = area_info.sort_values(by=["area"], ascending=[True])
area_info= area_info.reset_index()
area_info
|
그리고 sort_values를 이용해 오름차순으로 정리해줍니다.
여기서 by='기준컬럼' , ascending=[True]는 오름차순입니다. 반대로 false는 내림차순입니다.
reset_index는 아래다가 다시 써줘야 내림차순으로 정리된 항목이 숫자대로 정리됩니다.
그리고 지역별 학생수를 구해주고 싶습니다.
|
number_of_students = pd.DataFrame(sparta_data.groupby('area')['user_id'].count())
number_of_students
|
위와 같이 코드를 써주면

요런 데이터가 나오게 됩니다.
두개의 테이블을 묶는 방법
|
#merge()를 이용하여, 두 테이블을 병합 할수 있어요
result = pd.merge(area_info, number_of_students, on="area")
result
|

이제 지역별 경도,위도, 그리고 학생수를 알수있는 테이블이 생겼습니다.
꺾은선 그래프로 나타내 주면
|
#merge()를 이용하여, 두 테이블을 병합 할수 있어요 :)!
result = pd.merge(area_info, number_of_students, on="area")
result
import matplotlib.pyplot as plt
import numpy as np
plt.rc('font', family='NanumBarunGothic') #한글 깨짐을 방지시켜줘요!
#그래프 사이즈 변경
plt.figure(figsize=(10,5))
#그래프 x축 y축
plt.plot(result['area'], result['user_id'])
#그래프 명
plt.title('지역별 사용자 수')
#그래프 x축 레이블
plt.xlabel('지역')
#그래프 y축 레이블
plt.ylabel('사용자(명)')
#x축 눈금 수
plt.xticks(np.arange(13))
#그래프 출력
plt.show()
|

이런 그래프가 나오게 됩니다. 지역별 사용자가 어디가 많은지 알 수 있네요
그리고 지도에 표시해주기위해
|
# 필요한 라이브러리 사용 선언하기
import folium
from folium.plugins import MarkerCluster
m = folium.Map(location=[37.5536067,126.9674308],
zoom_start=8)
|
지도 라이브러리를 불러와줍니다.
그리고 다음 함수를 이용해주면
|
for n in result.index:
radius = result.loc[n,'user_id']
#loc[n,"열 이름"] => loc[]를 활용하여 n번째의 열을 조회 할수 있습니다!
#즉, n번째의 user의 수를 가져 올수 있는 것이죠!
folium.CircleMarker([result['latitude'][n],result['longitude'][n]],
radius = radius/50, fill=True).add_to(m)
#.add_to(m)를 활용하여, 지정해 두었던 우리나라의 지도를 가져올 수 있습니다!
m
|

요렇게 지역별로 수강생 분포를 알 수 있습니다.
학습후 느낀점
숙제로 비슷한 문제를 한번 풀어봤는데 아직도 너무 어려운것 같습니다.
그래도 여러번 비슷한 문제를 풀어봐야지 감이 잡힐것같습니다.
지금 어려운점은 명령어를 어느정도 이해하면서 사용해야하는데 SQL과는 다르게 이해가 되지 않고 복사 붙여넣기 한뒤 파일 이름만 바꿔주는 형식으로 배우는 것 같아요.
4,5 주차 강의를 들으면서 조금더 다지면서 해봐야겠습니다.