3주차
데이터에 기반해서 문제를 해결하는 방법
[문제 1] 강의 중 가장 어려운 것은 무엇일까?
라이브러리 불러오기
import pandas as pd
분석해 볼 데이터를 불러오기
enroll = pd.read_csv('./data/enrolleds_detail.csv')
enroll
enroll_detail = enroll.groupby('lecture_id')['user_id'].count()
enroll_detail
데이터 살펴보기
주어진 데이터는 강의 아이디, 수강 완료 시간, 사용자 아이디
enroll_detail.tail(5)
그래프 그리기
import matplotlib.pyplot as plt
# Apple은 'AppleGothic', Windows는 'Malgun Gothic'을 추천
plt.rcParams['font.family'] = "Malgun Gothic"
plt.figure(figsize= (22,5)) # 그래프의 사이즈
plt.bar(enroll_detail.index,enroll_detail)
plt.title('강의에 따른 수강 완료 수의 합계') # 그래프의 제목
plt.xticks(rotation=90)
plt.show() # 그래프 그리기
강의 제목 불러오기
lectures = pd.read_csv('./data/lectures.csv')
lectures
강의 제목과 연결하기
lecture_count = pd.DataFrame(enroll_detail)
lecture_count
인덱스 다시 지정
lecture_count = lecture_count.reset_index()
lecture_count
유저 아이디를 카운트로 변경
lecture_count = lecture_count.rename(columns= {'user_id':'count'})
lecture_count
Join
lectures = lectures.set_index('lecture_id')
lectures
full_lecture = lecture_count.join(lectures, on='lecture_id')
full_lecture
강의 제목과 연결된 바 그래프 그리기
plt.figure(figsize=(22,5))
plt.bar(full_lecture['title'], full_lecture['count'])
plt.title('강의에 따른 수강완료 수의 합계')
plt.xlabel('강의명')
plt.xticks(rotation=90)
plt.show()
Fact: 2주차가 끝나고 3주차에 돌아오는 숫자가 2주차 끝나는 거에 비해 몇 퍼센트가 적다 (수치로 얘기해 줘야함)
[문제 2] 강의 자막으로 워드 클라우드 만들기
워드 클라우드: word(단어) + cloud(구름)
Ex) 키워드 그림에서 큰글씨와 옆에 짜잘짜잘 글씨들
워드 클라우드 설치하기
conda install -c conda-forge wordcloud
라이브러리 불러오기
import numpy as np
from PIL import Image
from wordcloud import WordCloud
import matplotlib.pyplot as plt
\n\n: 개행(문장과 문장을 구분해줌) = enter
.replace(): 제거
replace뜻: 변환하다 대체하다
text = open('./data/Sequence_01.txt')
text = text.read()
text = text.replace('\n', " ")
text
text2 = open('./data/Sequence_02.txt')
text2 = text2.read()
text2 = text2.replace('\n', " ")
text2
데이터 불러오기
for number in range(1,15):
index = '{:02}'. format(number)
filename = "Sequence_" + index + ".txt"
text = open('./data/'+filename, 'r', encoding='utf-8-sig')
result = result + text
result += text 로 줄일 수 있음
result = ""
for number in range(1,15):
index = '{:02}'. format(number)
filename = "Sequence_" + index + ".txt"
text = open('./data/'+filename, 'r', encoding='utf-8-sig')
result += text.read().replace("\n", " ")
result
특수기호 제거 방법 = 정규식(비교하는 거)
(꼭 안 해도 되지만 깨끗한 워드 클라우드를 만들기 위해서)
import re (regular expression) 정규식을 쓰기 위한 라이브러리
pattern = '[^\w\s]' # 특수 기호 제거
text = re.sub(pattern=pattern, repl='', string=result)
text
개행(엔터 기호, \n)과 다른 특수기호 싹 날림
워드 클라우드 생성하기
한글 설정
글꼴 뭐 있는지 확인
import matplotlib.font_manager as fm
# 이용 가능한 폰트 중 '고딕'만 선별
for f in fm.fontManager.ttflist:
if 'Gothic' in f.name:
print(f.fname)
font_path = '/System/Library/Fonts/Supplemental/AppleGothic.ttf'
wc = WordCloud(font_path=font_path, background_color="white")
wc.generate(text)
plt.figure(figsize=(50,50))
plt.axis("off")
plt.imshow(wc)
plt.show()
참고 링크
https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html
나만의 워드 클라우드 만들기
# Generate a word cloud image
mask = np.array(Image.open('./data/sparta.png'))
wc = WordCloud(font_path=font_path, background_color="white", mask=mask)
wc.generate(text)
f = plt.figure(figsize=(50,50))
f.add_subplot(1,2, 1)
plt.imshow(mask, cmap=plt.cm.gray)
plt.title('Original Stencil', size=40)
plt.axis("off")
f.add_subplot(1,2, 2)
plt.imshow(wc, interpolation='bilinear')
plt.title('Sparta Cloud', size=40)
plt.axis("off")
plt.show()
워드 클라우드 이미지 저장하기
mask = np.array(Image.open('./data/sparta.png'))
wc = WordCloud(font_path=font_path, background_color="white", mask=mask)
wc.generate(text)
f = plt.figure(figsize=(50,50))
plt.imshow(wc, interpolation='bilinear')
plt.title('나만의 워드 클라우드', size = 40)
plt.axis("off")
plt.show()
f.savefig('./data/myWordCloud.png')
[문제 3] 적절한 즉문즉답 시간은 언제일까?
Bumpy 수학적 계산을 좀 편하게 도와줌
라이브러리 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = "AppleGothic"
데이터 불러오기
sparta_data = pd.read_csv('./data/enrolleds_detail.csv')
sparta_data
필요한 데이터 정하기
무슨 요일, 몇 시에 수강생들이 강의를 듣는가입니다. 이를 위해서는 요일별, 시간별 데이터가 필요
날짜로 바꾸기(시간 데이터 전처리)
유럽 일월년
format = '%Y-%m-%dT%H:%M:%S.%f' (f: ms(밀리세컨드))
sparta_data['done_date_time'] = pd.to_datetime(sparta_data['done_date'], format=format)
sparta_data
요일 추가해주기
sparta_data['done_date_time_weekday'] = sparta_data['done_date_time'].dt.day_name() (day_name: 요일)
sparta_data
제2의 즉문즉답 시간 알아내기
요일 별 수강 완료 수강생 수 전처리 하기
weekdata = sparta_data.groupby('done_date_time_weekday')['user_id'].count()
weekdata
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekdata = weekdata.agg(weeks)
weekdata
Agg: aggregation 데이터를 요일별로 모아줌
요일별 수강 완료 수강생 수 바 그래프 그리기
plt.figure(figsize=(8,5))
plt.bar(weekdata.index, weekdata)
plt.title('요일별 수강 완료 수강생 수')
plt.xlabel('요일')
plt.ylabel('수강생(명)')
plt.xticks(rotation=90)
plt.show()
시간별 데이터 추출
sparta_data['done_date_time_hour'] = sparta_data['done_date_time'].dt.hour
sparta_data
시간 별 수강 완료 수강생 수 전처리 하기
hourdata = sparta_data.groupby('done_date_time_hour')['user_id'].count()
hourdata = hourdata.sort_index()
hourdata
선(라인) 그래프 = plot
plt.figure(figsize=(10,5))
plt.plot(hourdata.index, hourdata)
plt.title('시간별 수강 완료 사용자 수')
plt.xlabel('시간')
plt.ylabel('사용자(명)')
plt.xticks(np.arange(24))
plt.show()
plt.xticks(np.arange(24)): 0부터 24개
즉 0부터 23까지 나옴
데이터 합치기 (엑셀의 피벗테이블처럼)
aggfunc(aggregation function): 분석방법
sparta_data_pivot_table = pd.pivot_table(sparta_data, values='user_id', aggfunc='count',
index=['done_date_time_weekday'],
columns=['done_date_time_hour']).agg(weeks)
sparta_data_pivot_table
pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
data: 분석할 데이터
values: 분석할 수
index: 행 인덱스
columns: 열 인덱스
aggfunc: 분석 방법
색깔 입혀보는 그래프(히트맵)
1.
plt.figure(figsize=(14,5))
plt.pcolor(sparta_data_pivot_table)
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.show()
2.
plt.figure(figsize=(14,5))
plt.pcolor(sparta_data_pivot_table)
plt.xticks(sparta_data_pivot_table.columns)
plt.yticks(sparta_data_pivot_table.index)
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.show()
3.
plt.figure(figsize=(14,5))
plt.pcolor(sparta_data_pivot_table)
plt.xticks(np.arange(0,len(sparta_data_pivot_table.columns),1),sparta_data_pivot_table.columns)
plt.yticks(np.arange(0,len(sparta_data_pivot_table.index),1),sparta_data_pivot_table.index)
plt.title('요일별 종료 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.show()
4.
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.show()
5.
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()
결론
수강생 즉문즉답을 위해서 완강함
주말에는 많이 안 함
평일 중에 2일 하는 거 추천
1. 나만의 워드 클라우드 만들기
import numpy as np
from PIL import Image
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = open('./data/mysong.txt', 'r',encoding='utf-8-sig')
result = text.read().replace('\n',' ')
result
뻥튀기 과정(10번 반복)
for number in range(0,10):
result = result + result
result
이미지
mask = np.array(Image.open('./data/ckm.png'))
font_path = '/System/Library/Fonts/Supplemental/AppleGothic.ttf'
wc = WordCloud(font_path=font_path, background_color="white", mask=mask)
wc.generate(result)
f = plt.figure(figsize=(50,50))
plt.axis("off") - 축없앰
plt.imshow(wc)
f.savefig('./data/mycloud.png')
2. 스파르타코딩클럽 수강의 월요일과 화요일 데이터 비교하기
돌발상황🚒 sparta_data 사라짐........
sparta_data_monday = sparta_data[sparta_data['done_date_time_weekday']== 'Monday']
sparta_data_monday = sparta_data_monday.groupby('done_date_time_hour').count()['user_id']
sparta_data_tuesday = sparta_data[sparta_data['done_date_time_weekday']== 'Tuesday']
sparta_data_tuesday = sparta_data_tuesday.groupby('done_date_time_hour').count()['user_id']
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.plot(sparta_data_monday.index, sparta_data_monday)
plt.plot(sparta_data_tuesday.index, sparta_data_tuesday)
plt.title('시간별 수강 완료자 수')
plt.xticks(np.arange(24))
내꺼에선 망함.
'IT > 개발' 카테고리의 다른 글
정보처리산업기사 실기 - 5주 단기 합격 플랜 (수제비 기준) (0) | 2025.03.11 |
---|---|
웹 개발 3주차 개발일지 (1/3~1/9) (0) | 2022.01.13 |
파이썬 2주차 개발일지 (12/27~1/2) (0) | 2022.01.05 |
웹 개발 2주차 개발일지 (12/27~1/2) (0) | 2022.01.05 |
파이썬 1주차 개발일지 (12/20~12/26) (0) | 2021.12.27 |