카테고리 없음

내일배움캠프_데이터분석종합반_3주차강의

iron-min 2025. 9. 10. 16:24

오늘 배운것

[미션1]

가장 적절한 고객 관리 타이밍 분석하기

 

우선 우리가 봐야할 데이터 입니다.

 

 

User Id와 access_date로 언제 접속률이 많은지 알 수 있습니다.

참고로 저렇게 엑셀을 열어봐도 되지만

sparta_data.head()

이렇게 위에 몇가지 데이터만 코딩데이터에서 불러와주어 데이터를 확인할 수 있습니다. 

 

import pandas as pd
sparta_data = pd.read_table('/content/access_detail.csv', sep=',')
배운대로  import 함수를 이용해 판다스를 사용해주고
read_table을 통해 파일을 불러와줍니다. 저 끝에 sep은 csv파일이면 붙여줘야 한다더군요.

 

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.figure(figsize=(10,5))
plt.rc('font', family='NanumBarunGothic') -> 한글이 깨져서 설정해준 명령어입니다.
#그래프 x축 y축
plt.bar(weekdata.index, weekdata)

#그래프 명
plt.title('시간별 수강 완료 사용자 수')

#그래프 x축 레이블
plt.xlabel('시간')

#그래프 y축 레이블
plt.ylabel('사용자(명)')

#x축 레이블을 90도로 변환
plt.xticks(rotation=0)

#그래프 출력
plt.show()

 

 

이렇게 코드를 입력해주면

요런 차트가 완성됩니다.

 

그리고 꺽은선 그래프를 만들고 싶다면

#그래프 사이즈 변경
plt.figure(figsize=(10,5))
plt.rc('font', family='NanumBarunGothic') -> 한글이 깨져서 설정해준 명령어입니다.
#그래프 x축 y축
plt.plot(hourdata.index, hourdata)

#그래프 명
plt.title('시간별 수강 완료 사용자 수')

#그래프 x축 레이블
plt.xlabel('시간')

#그래프 y축 레이블
plt.ylabel('사용자(명)')

#x축 눈금 표시 하기
plt.xticks(np.arange(24))

#그래프 출력
plt.show()
 

이렇게 plt.bar를 plt.rc로 바꿔주면 됩니다.

 

그리고 히트맵을 나타내기 위해 피벗테이블을 만들어 줍니다.

#피벗테이블 만들기
#columns : 열에 들어 가는 부분
#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

 

그러면 요렇게 피벗테이블이 만들어 집니다.

 

그리고 그래프를 코드를 넣어주면

#그래프 사이즈 변경
plt.figure(figsize=(14,5))

#pcolor를 이용하여 heatmap 그리기
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('요일')

#plt.colorbar() 명령어를 추가하면 그래프 옆에 숫자별 색상값을 나타내는 컬러바를 보여 줍니다
plt.colorbar()
plt.show()

 

 

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

 

np.arange(3,10,1
이렇게 쓰면 '3부터, 10까지, 1을 단위로 나열해라' 라는 뜻입니다.
 
그래서 위의 np.arange를 보면 0.5부터 시작해서 차트가 저렇게 만들어질 수 있습니다.

 

이렇게 되면 요일별 몇시쯤에 종료가 가장많이 되었는지 알 수 있겠죠.

 

 

[미션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 주차 강의를 들으면서 조금더 다지면서 해봐야겠습니다.