데이터분석 | 가장 적절한 고객 관리 타이밍 | 제품 수요가 많은 지역 찾기

    728x90

     

    0. 가설 설정하기

     

    ▶ 가설1 : 가장 적절한 고객관리 타이밍은?

    강의 완주율 개선을 위한 고객관리 메시지를 보낼 최적의 시간대 찾기

    • 온라인 강의를 수강생들이 가장 많이 혹은 가장 적게 듣는 요일과 시간 찾기

    1. 분석할 데이터 가져오기

     

    ▶ 라이브러리 가져오기

    import pandas as pd

     

    ▶ 스파르타 데이터 읽어오기

    sparta_data = pd.read_table('/content/access_detail.csv', sep = ',')
    sparta_data.head()

     

    • lecture_id : 수강 강의 id
    • access_date : 접속 시작 날짜 및 시간
    • user_id : 유저 id

    2. 데이터 전처리하기

     

    우리가 필요한 데이터는 '요일'과 '시간' 데이터

    access_date (처리 일자) 데이터에서 뽑아내기

     

    2-1) access_date (처리 일자) 의 데이터타입을 문자(str) → 시간(time)으로 바꾸기

     

    ▶ access_date (처리 일자) 데이터 타입 확인하기

    print(type(sparta_data['access_date'][0]))

     

    to.datetime() 함수로 (처리 일자) 를 '시간' 타입으로 바꾸기

    • %Y: 연도
    • %m: 월
    • %d: 일
    format='%Y-%m-%dT%H:%M:%S.%f'
    sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format=format)
    sparta_data.tail(5)

     

    ▶ access_date (처리 일자) 데이터 타입 다시 확인하기

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


    2-2) access_date_time (처리 일자 시간) 데이터로 요일 별 수강생 수 구하기

     

    dt.day_name() 함수로 요일 추출, dt.hour로 시간 추출하기

    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)


    3. 데이터 분석하기

     

    3-1) 요일 별 수강생 수 구하기

     

    ▶ 요일 별로 그룹화해서 데이터 수 세주기

    : groupby('컬럼명')을 사용하면 데이터를 특정 기준으로 그룹화해서 처리할 수 있음

    weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()
    weekdata

     

     

    + 여기에 agg('변수')를 이용하면 변수 안의 데이터 별 합계를 구할 수 있음

    : weeks의 리스트에 따라 데이터들을 다시 한 번 재배열 할 수 있음

    weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    weekdata = weekdata.agg(weeks)
    weekdata

     


    3-2) 시간 별 수강생 수 구하기

     

    ▶ 시간 별로 그룹화해서 데이터 수 세준 뒤 정렬하기

    sort_index() 해당 데이터를 오름차순으로 정렬해주는 기능

    sort_index(ascending=False) 해당 데이터를 내림차순으로 정렬해주는 기능

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

     


    4. 데이터 시각화하기

     

    ▶ 라이브러리 가져오기

    import matplotlib.pyplot as plt
    import numpy as np

    4-1) 그래프 그리기

     

    ▶ weekdata (요일 별 수강생 수) 데이터로 그래프 그리기

    #그래프 사이즈
    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()

    >> 화요일, 일요일에 수강을 완료하는 인원이 제일 많음

    >> 금요일, 수요일에 수강을 완료하는 인원이 제일 적음

     

    ▶ hourdata (시간 별 수강생 수) 데이터로 그래프 그리기

    #그래프 사이즈 변경
    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()

    >> 저녁 18시 경에 수강 완료 수가 제일 많았고, 밤 21시쯤에 감소하는 추세를 보임. 그리고 다시 오전 7시부터 수강 완료 수가 올라가는 추세를 보임.

     

    ▶ (참고) np.arange() 함수로 숫자 세기 

    print(np.arange(24))

     


    4-2) 피벗테이블 그리기

     

    ▶ 피벗테이블 만들기

    pd.pivot_table() 함수

    #values : 열에 들어 가는 부분
    #index : 행에 들어가는 부분
    #aggfunc : 데이터 축약시 사용할 함수
    
    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

     


    4-3) 피벗테이블을 이용해 히트맵 그리기

    #그래프 사이즈 변경
    plt.figure(figsize=(14,5))
    
    #pcolor를 이용하여 heatmap 그리기
    plt.pcolor(sparta_data_pivot_table)
    
    #히트맵에서의 x축   # np.arange(시작, 끝, 간격)
    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()

    >> 요일별, 시간대 별로 살펴봐도 화요일 18시 경에 수강 완료자가 가장 많은 것을 알 수 있음 


    5. 최종 결론

     

    ▶ 결론1

    강의 완주율이 가장 높은 요일화요일, 일요일 순이고, 강의 완주율이 가장 높은 시간대저녁 18시 경임.

    반대로 강의 완주율이 가장 낮은 요일금요일, 수요일이었음. 강의 완주율은 밤 21시부터 떨어지다가 오전 7시부터는 다시 올라가는 추세를 보임.

    요일 별, 시간대 별로 살펴보았을 때는 화요일 18시 경이 가장 강의 완주율이 높은 시간이라는 것을 알 수 있음.

    따라서 강의 완주를 위한 독려 문자는 화요일과 일요일 저녁시간 쯤, 동기부여 문자는 금요일과 수요일 오전에 보내는 것이 좋겠다고 생각함.


    0. 가설 설정하기

     

    ▶ 가설2 : 가장 수강을 많이 하는 지역 찾기

    제품 수요가 많은 지역을 찾으면 광고를 더 효율적으로 집행할 수 있을 것 같음

    • 수강 신청을 많이 하는 지역 살펴보기
    • 지역별 수강생 수 구하기

    1. 분석할 데이터 가져오기

     

    ▶ 라이브러리 가져오기

    import pandas as pd

     

    ▶ 스파르타 데이터 읽어오기

    sparta_data = pd.read_table('/content/students_area_detail.csv',sep=',')

    sparta_data.head()

     

    • lecture_id : 수강 강의 id
    • area : 접속지역
    • latitude : 해당 지역 위도
    • longtitude : 해당 지역 경도
    • user_id : 유저 id

    2. 데이터 전처리하기

     

    ▶ area (지역) 데이터 목록 확인하기

    : set()으로 중복값이 없는 데이터 목록 살펴보기

    category_range = set(sparta_data['area'])
    print(category_range, len(category_range))


    3. 데이터 분석하기

     

    3-1) 지역 별 위도, 경도 표 만들기

     

    ▶ 지역 정보로만 이루어진 새로운 테이블 만들기

    : 필요한 데이터(접속지역, 해당 지역 위도, 해당 지역 경도)로 이루어진 새 테이블 만들기

    area_info = sparta_data[['area','latitude','longitude']]

    area_info.head()

     

    ▶ 중복 지역이름 삭제하기

    : drop_duplicates('컬럼명')으로 area(지역) 컬럼의 중복 데이터 처리

    area_info=area_info.drop_duplicates(['area'])

    area_info.head()

     

    .sort_values() 함수로 정렬하기

    : by = area (지역) 데이터 기준으로 정렬

    : ascending = True 오름차순 정렬

    area_info = area_info.sort_values(by=["area"], ascending=[True])  # False면 내림차순

     

    .reset_index() 함수로 인덱스 정리해주기

    area_info = area_info.reset_index()

     


    3-2) 지역별 수강생 수 구하기

     

    .groupby() 함수 + 집계함수 콜라보

    : area (지역) 데이터로 묶은 뒤 

    : user_id (사용자 아이디) 데이터를 .count() 하기

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

    number_of_students


    3-3) [지역별 위도, 경도 표]와 [지역별 수강생 수 표] 합치기

     

    .merge() 함수로 [3-1]표와 [3-2]표 합치기

    result = pd.merge(area_info, number_of_students, on="area")

    result


    4. 데이터 시각화하기

     

    ▶ 라이브러리 가져오기

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.rc('font', family='NanumBarunGothic') #한글 깨짐 방지

    4-1) 지역별 수강생 수 그래프 그리기

    #그래프 사이즈 변경
    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()

    >> 서울 지역의 수강생 수가 제일 많고, 그 다음은 대전, 부산 지역 순으로 수강생이 분포되어 있음

     

    ※ 한글 폰트가 깨질 경우 사용

    # 코드 실행 후 [런타임_재시작] 하기
    !sudo apt-get install -y fonts-nanum
    !sudo fc-cache -fv
    !rm ~/.cache/matplotlib -rf
    
    # plt.rc('font', family='NanumBarunGothic')

    4-2) 지역별 수강생 수 지도에 표시하기

     

    ▶ 라이브러리 가져오기

    • 폴리움(Folium): 분석한 데이터의 결과를 지도에 그려주는 라이브러리
    • 마커 클러스터(MarkerCluster): 가까운 거리의 marker들을 군집시켜, 해당 건수를 표현해줌
    import folium
    from folium.plugins import MarkerCluster

     

    ▶ 대한민국 위도, 경도 설정하기

    m = folium.Map(location=[37.5536067,126.9674308],
                   zoom_start=8)

    m

     

    ▶ result 데이터를 반복문으로 읽어서 지도에 찍기

    : 12개 지역의 위도, 경도와 해당 지역의 수강생 수를 반복문으로 마킹해주기

    for n in result.index:
      radius = result.loc[n,'user_id']
    	# loc[n, "열 이름"] >> loc[]로 n번째 열 조회 가능
    	# 즉, n번째의 user_id 수를 가져 오는 것
      folium.CircleMarker([result['latitude'][n],result['longitude'][n]],
                            radius = radius/50, fill=True).add_to(m)
    	#.add_to(m)로 지정해 두었던 우리나라 지도 가져오기

    m


    5. 최종 결론

     

    ▶ 결론2

    서울 지역의 수강생 수가 제일 많고, 대전, 부산 순으로 수강생 수가 많음

    서울 지역을 중심으로 수강생 수가 많은 지역을 중심으로 광고비를 더 집중해도 좋겠다고 생각함

    728x90

    댓글