본문 바로가기
IT/개발

파이썬 3주차 개발일지 (1/3~1/9)

by 멍치킨 2022. 1. 13.

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

 

 

내꺼에선 망함.