업무에 파이썬 활용할 줄 알기

데이터 분석 종합반 3주차 복습 본문

Python/[스파르타] 데이터 분석 종합반

데이터 분석 종합반 3주차 복습

SEO 데이터분석가 2023. 11. 29. 12:13

3-1. 3주차 오늘 배울 것

3-2. 데이터 분석 세팅

3-3. [미션1] 가장 적절한 고객 관리 타이밍_분석 준비하기

3-4. [미션1] 가장 적절한 고객 관리 타이밍_분석 및 시각화

3-5. [미션2] 제품 수요가 많은 지역을 찾아라_라인 그래프 그리기

3-6. [미션2] 제품 수요가 많은 지역을 찾아라_지도에서 한눈에 보기

3-7. 숙제_최적의 즉문즉답 시간대를 찾아라

 

3-1. 3주차 오늘 배울 것

상관관계 말고 어떤 분석을 할 수 있는지

막대, 라인 그래프 외 어떤 그래프를 그릴 수 있는지

3-2. 데이터 분석 세팅

3-3. [미션1] 가장 적절한 고객 관리 타이밍_분석 준비하기

테이블 구성해야할 것

 

요일이랑 시간을 빼내어야 함

[날짜 컬럼].dt.day_name

[날짜 컬럼].dt.hour

 

※ 주의사항

dt.hour()로 쓰면 안됨. 괄호없이 dt.hour로 써야 함.

 

 

3-4. [미션1] 가장 적절한 고객 관리 타이밍_분석 및 시각화

요일별 / 막대그래프

※ 한글이 깨질 때

 

시간별 / 라인그래프

왜 안돼지 갑자기

 

히트맵

 

<복습>

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


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

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

format='%Y-%m-%dT%H:%M:%S'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format=format)
sparta_data.head()

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

sparta_data['access_weekday'] = sparta_data['access_date_time'].dt.day_name()
sparta_data['access_hour'] = sparta_data['access_date_time'].dt.hour
sparta_data.tail()

#요일별 사용자수 구하기
weekdata = sparta_data.groupby('access_weekday')['user_id'].count()
weekdata

#시간별 사용자수 구하기
hourdata = sparta_data.groupby('access_hour')['user_id'].count()
hourdata = hourdata.sort_index(ascending=False)
hourdata

#요일별 사용자수 막대그래프
plt.figure(figsize=(10,5))
plt.bar(weekdata.index, weekdata)
plt.title('요일별 수강 완료 수강생 수')
plt.xlabel('요일')
plt.ylabel('수강생(명)')
plt.show()

#시간별 사용자수 라인그래프
plt.figure(figsize=(10,5))
plt.plot(hourdata.index, hourdata)
plt.title('시간별 수강 완료 사용자 수')
plt.xlabel('시간')
plt.ylabel('사용자(명)')
plt.xticks(np.arange(24))
plt.show()

#그래프 그리기 내가 이해한 것
#그래프 그릴 데이터테이블을 먼저 만들어 준 다음 그래프를 그려준다 

#피벗테이블 만들기 / 요일별 시간대별 사용자수
weeks = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
sparta_data_pivot = pd.pivot_table(sparta_data, values = 'user_id',
                                   index = ['access_weekday'],
                                   columns = ['access_hour'],
                                   aggfunc = "count").agg(weeks)

                                   #.agg(weeks)가 뭘까
sparta_data_pivot

#히트맵 그래프 / 요일별 시간대별 사용자수
plt.figure(figsize=(14,5))
plt.pcolor(sparta_data_pivot)
plt.xticks(np.arange(0.5, len(sparta_data_pivot.columns), 1), sparta_data_pivot.columns)
plt.yticks(np.arange(0.5, len(sparta_data_pivot.index),1), sparta_data_pivot.index)
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar()
plt.show()

#plt.xticks, plt.yticks 함수 구성 이해안감

 

 

3-5. [미션2] 제품 수요가 많은 지역을 찾아라_라인 그래프 그리기

 

 

<My solution>

나는 이렇게 했는데, 강사님은 pd.DataFrame을 먼저 선언하셨다. pd.DataFrame을 먼저 선언하는 방식은 처음 배우는데?

 

 

 

<복습>

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))

#area, latitude, longtitude 컬럼만 남기기
area_info = sparta_data[['area','latitude','longitude']]

#중복제거
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

#2개 테이블 합치기
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))
plt.plot(result['area'],result['user_id'])
plt.title('지역별 사용자 수')
plt.xlabel('지역')
plt.ylabel('사용자 수')
plt.xticks(np.arange(13))
plt.show()

#만약 여러개의 그래프를 나타내고 싶으면 어떻게 하나?
#이전 실습에서 다양한 여러개의 그래프를 나타냈던 것 같긴한데..

 

※ xticks의 사용 유무 그래프 차이

xticks 사용안했을 때
plt.xticks(np.arange(13)) 사용했을 때

3-6. [미션2] 제품 수요가 많은 지역을 찾아라_지도에서 한눈에 보기

 

 

3-7. 숙제_최적의 즉문즉답 시간대를 찾아라

#수강생들의 수업 완료 시간대는 주로 한가한 주말일 것이다

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

raw = pd.read_table('/content/done_detail.csv', sep = ',')
raw.head()

#최종데이터: 수업 완료 요일별 수강생 수 (테이블,바그래프)

#done_date 시간 타입으로 변경하여 시간컬럼 따로 만들어주기
format = '%Y-%m-%dT%H:%M:%S'
raw['done_date_datetype'] = pd.to_datetime(raw['done_date'], format=format)
raw['done_day'] = raw['done_date_datetype'].dt.day_name()
raw.head()

#테이블 구성
weeks = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
users_bydoneday = raw.groupby('done_day')['user_id'].count()
users_bydoneday = users_bydoneday.agg(weeks) #이게 어떤 함수지?
users_bydoneday

#바그래프 구성

plt.figure(figsize=(10,5))
plt.bar(users_bydoneday.index, users_bydoneday)
plt.title('요일별 수강완료 수강생수')
plt.xlabel('수강완료 요일')
plt.ylabel('수강생수')
plt.show()

#몇명인지 나타낼 수 없나

#특별히 튀는 시간대가 있을 수 있지 않나?
#각 요일마다 시간대별 수강생 수 추이를 그려보고 싶은데?
#for문을 써서 7개의 그래프를 그려볼 수는 없을까?

#시간컬럼추가
#요일별 시간별
#일단 피벗테이블을 먼저 만들까?
#chatgpt를 활용하려면 뭘 어떻게 물어봐야하지?

 

 ※ users_bydoneday.agg(weeks)에서 agg()메서드는 어떤 역할을 하는가?

해당 함수 존재 여부에 따라 전후를 비교해보면 agg함수를 쓰지않으면 는 요일 정렬이 뒤죽박죽임

왜 일반적인 설명과 쓰임새가 다른 것 같지?

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.agg.html

<즉문즉답 답변>

weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = sparta_data.groupby('access_date_time_weekday')['user_id'].count()

print(weekdata)
weekdata = weekdata.agg(weeks)
print()
print(weekdata)

------
access_date_time_weekday
Friday        859
Monday       1354
Saturday      926
Sunday       1541
Thursday      937
Tuesday      1624
Wednesday     887
Name: user_id, dtype: int64

Monday       1354
Tuesday      1624
Wednesday     887
Thursday      937
Friday        859
Saturday      926
Sunday       1541
Name: user_id, dtype: int64

 

잘모르겠는 것

피벗테이블 함수구성에서 .add(weeks)가 뭘까

plt.xticks, plt.yticks 함수 구성 이해안 됨

 

folium 패키지 함수들 전혀 이해가 안간다

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']
  folium.CircleMarker([result['latitude'][n],result['longitude'][n]],
                        radius = radius/50, 
                        fill=True
                        ).add_to(m)

#folium.CircleMarker 이해하기
#마커를 지도위에 표시해줄건데
#마커를 어떤 위치에 어떤 형태로 표시할건지 정의
#그리고 .add_to(m)으로 그 표기를 m이라는 지도에 더해주겠다

#그래서 내가 하고자 하는 것
#사용자수 크기를 동그라미의 크기로 나타내고 싶음.


#1. 사용자수 데이터 가져오기
#loc
#행 또는 열의 데이터를 조회하는 함수임. 아.. pandas공부할 때 봤던 것 같다

#2. 사용자수 크기에 따라 동그라미 표기해주기
#folium.circleMarker



#loc[n,"열 이름"]  => loc[]를 활용하여 n번째의 열을 조회 할수 있습니다!
#즉, n번째의 user의 수를 가져 올수 있는 것이죠!

 

※ loc 기억 되살리기 참고:

https://m.blog.naver.com/wideeyed/221964700554

 

[Pandas] loc[ ] 로 행, 열 조회하기

Pandas(판다스, 팬더스) Dataframe(2차원, 행열)에서 loc를 이용해서 행 또는 열의 데이터를 조회하는 방...

blog.naver.com

 

※ folium.CircleMarker 함수 구성 이해하기

https://python-visualization.github.io/folium/latest/user_guide/vector_layers/circle_and_circle_marker.html

 

Circle and CircleMarker — Folium 0.1.dev1+gc1d27de documentation

Circle and CircleMarker CircleMarker has a radius specified in pixels, while Circle is specified in meters. That means a CircleMarker will not change size on your screen when you zoom, while Circle will have a fixed position on the map. import folium m = f

python-visualization.github.io