커리어 스터디
3일차 : "공정에서 발생할 수 있는 문제를 상상해 보자"
- 개인 학습:
- 2일차에 조사한 공정을 바탕으로, 관련 데이터를 탐색합니다.
- 데이터 탐색?전세계의 다양한 주제의 데이터를 찾아볼 수 있습니다.
- Kaggle: Your Machine Learning and Data Science Community
- 데이터 분석가 / 과학자 / 엔지니어의 놀이터, 캐글을 방문해보세요!
- 해당 공정에서 발생할 수 있는 문제를 구체적으로 정의합니다.
- 문제 정의 예시:
- "조립 공정에서 기계 간 생산 속도 차이로 병목 현상이 발생한다."
- "포장 공정에서 특정 시간대에 불량률이 급증한다."
- 문제 정의 예시:
- 2일차에 조사한 공정을 바탕으로, 관련 데이터를 탐색합니다.
- 스크럼 :
- 각자가 찾은 데이터와 정의한 문제를 공유하고, 팀원들과 원인과 해결 방안을 가볍게 고민합니다.
- 서로 다른 산업의 문제를 들으며 새로운 관점을 얻을 수 있습니다.
링크 : Exploratory Data Analysis (EDA) // 7조
[12/18] A07 - 오늘의 한마디! | Notion
매일 오전/오후 총 2번 진행하여 작성해주세요!
teamsparta.notion.site
느낀점 :
1. 처음엔 어떻게 진행해야 할 지 갈피를 못 잡았음
이유 : 캐글을 처음 써보기도 하고 철강 산업 공정에서 발생할 수 있는 문제점이 어떤 것이 있을지 예상하느라 바뻐서
2. 캐글이 영문 사이트인데 번역기 최고
3. 처음에 포기했었지만 갈피를 잡고 나름 준수한 결과를 만든 것 같아 기쁨
4. 정해진 시간을 두고 그 시간안에 끝내지 못함이 아쉬움
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
데이터 분석 5주차 복습 (12월 18일 기준 5-1~5-7 정리)
금일 목표 : 강의자료 위주 복기 할만한 것 정리하기
금일 TIL 컨셉: 강의자료를 내 식대로 문서화 해보자
5주차 선정 이유 : 제일 어렵고 이해가 더뎌서
- 시작 전 살펴볼 내용
업무 지시 사항 : 8 월 중순부터 완주율이 크게 떨어졌습니다 . 이유를 찾아서 개선해봅시다 !
업무를 위해서
0. 변수 파악 :
생각한 가설 이외의 다른 변수가 있으면 데이터 분석이 유효하기 어려움
따라서, 전체적으로 영향을 주는 요소에 대해 살필 필요가 있음
1. 가설 설정
2. 가설 증명이 필요
1) 데이터 분석을 위한 기초 데이터 선정 및 데이터 정리(공란 제거, 의미 없는 자료 삭제, 형식 변경 등)
2) 데이터 분석
3) 분석 결과 시각화
4) 최종 결론
- 업무 시작
*데이터 분석 전 데이터 전처리는 필수
필요 코드: info / format / datetime
0. 변수 파악
0-1) 고객의 수강 생활 동안 문제가 될 수 있는 요소 파악
0-1-1) 시간적 여유 여부
- 당사에서 직접적으로 해결할 수 없는 상태
-> 추후 컨텐츠 제작이나 마케팅 시 활용 가능
=> 알아보자
0-1-2) 강의의 필요성
- 고객에게 강의의 필요성을 어필 / 동기부여 형성
-> 찐한 관리라는 서비스를 실행중
=> 찐한 관리에 대해 알아보자
0-1-3) 일간 목표 달성 여부
- 컨텐츠를 개선하여 해결이 가능
-> 흥미도가 실용성에 대해 확인해볼 필요가 있음
=> 알아보자
0-1-4) 콘텐츠 접근성
- 고객이 강의를 원활하게 수강할 수 있도록 강의 환경 개선은 최신 업데이트 상태
-> 문제X
가설 설정 & 증명
0-1-1) 시간적 여유 여부 에 대한 가설 설정 & 증명
1) 가설 설정
1-1) 시간이 없어 수강하지 못하는 경우 무언가를 개선한다고 완주할 수 없음
- 현재 강의시간 9TO9에 문제가 없는지 확인 필요
-> 수강생의 메인 타겟 : 구매 건수가 높은 20~30대 / 20~30대의 이벤트 참여율 저조 참여하지 못한 이유 : 바빠서
=> 다른 연령대에 비해 바쁜 20~30대의 수강 완주율이 상대적으로 낮을 것이다.
1-2) 고객에게 강의의 필요성을 어필해야함
- 고객의 동기부여를 위해 현재 찐한 관리라는 프로그램을 실행중
-> 찐한 관리가 완주율과 연관이 있을 것
1-3) 컨텐츠 개선이 수강율에 의미가 있을 것임
- 8월 중순쯤 컨텐츠 개편이 일어났음을 확인
-> 8월2주차 개강반부터 새로 제작된 콘텐츠 듣기 시작
=> 8월2주차 개강반 부터 수강율이 떨어졌을 것
2) 증명
나이대별 완주율을 비교해보자
2-1) 나이대별 완주율 비교
2-1-1) 나이대별 완주율 평균 구하기
필요한 데이터는 age / progress_rate 이다
필요한 코드는 groupby / sum 이다
코드 :
progress_rate_by_age=sparta_data.groupby('age')['progress_rate'].sum()
progress_rate_by_age
해설 :
progress_rate_by_age만들거야
나이대 별로 progress_rate를 합해서 알려줘
결과 : 각 나이대별 수강율의 총합 도출
2-1-2) 나이대별 총 인원수 구하기
필요한 데이터는 age / _id 이다
필요한 코드는 groupby / count 이다
코드:
number_people_by_age=sparta.data.groupby('age')['_id'].count()
number_people_by_age
해설:
number_people_by_age 만들거야
나이대별로 _id의 총 합을 알려줘
결과:
각 나이대별 총 인원수 도출
2-1-3) 나이대별 완주율 구하기
필요한 데이터 progress_rate_by_age / number_people_by_age
코드:
average=progress_rate_by_age / number_people_by_age
average
결과 :
나이대별 수강율이 XX.YFDS... 형식으로 도출
2-1-4) 그래프로 시각화
필요한 데이터 average
필요한 코드 figure / xticks / dar / for문 / title / x,ylabel / show
코드:
plt.figure(figsize=(6,6))
plt.xticks([10,20,30,40,50])
plt.bar(average.index, average,width=8)
bar = plt.bar(average.index, average,width=8)
for rect in bar:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width()/2.0, height, '%.1f' % height, ha='center', va='bottom', size = 12)
plt.title('[나이대별 평균 수강율]',fontsize=15,pad=20)plt.title('[나이대별 평균 수강율]',fontsize=15,pad=20)
plt.xlabel('나이',fontsize=12,labelpad=20)
plt.ylabel('수강생(명)',fontsize=14,rotation=360,labelpad=35)
plt.show()
결과: 그래프 도출
*for문 은 바 상단에 값을 명시하기 위해 쓰임
2-1-5) 결론 도출
20~30대 수강생들의 수강율이 오히려 나머지 비교군들 보다 높았다.
당시 퀴즈 이벤트 참여율만 저조했을뿐 프로덕트 개선이나 광고 메인 타겟 변경 등은 고려에서 배제 가능
2-2) 찐한 관리 유무에 따른 완주율 비교
2-2-0) 데이터 전처리
필요 데이터 info (managed 타입이 bool(lean) 타입이라 변경이 필요해)
필요 코드 'TRUE' / 'FALSE'
코드
managed=['TRUE','FALSE']
managed
결과 :
false xy.fda... true se.gxdf... 도출
** 추후에 groupyby 명령어 업데이트 될 예정
managed_data_avg = sparta_data.groupby
->
groupby.sparta_data ...
**** 이거 없어도 괜찮은데 왜 있어?
리스트 만들어서 원하는 값 선택하거나 필터링할라고 (사진 참고)
2-2-1) 찐한관리의 유무에 따라 수강 완료율 평균 구하기
필요한 데이터: managed / progress_rate / _id
필요한 코드: groupby / count / sum
코드:
managed_data_avg=sparta_data.groupby('managed')['progress_rate].sum()/sparta_data.groupby('managed')['_id'].count()
managed_data_avg
결과:
true(관리 받았을 시) 완주율 과 false 완주율 도출
2-2-2) 그래프 시각화
필요한 데이터 : managed_data_avg
필요한 코드 figure / x,yticks / dar / for문 / title / x,ylabel / show
코드:
plt.figure(figsize=(6,6))
plt.bar(managed_data_avg.index,managed_data_avg.values)
bar = plt.bar(managed_data_avg.index,managed_data_avg.values)
for rect in bar:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width()/2.0, height, '%.1f' % height, ha='center', va='bottom', size = 12)
plt.title('찐한관리 유무에 따른 평균 완주율',fontsize=14)
plt.xlabel('평균 완주율',fontsize=12)
plt.xticks([0,1], labels=["찐한관리 비 신청자","찐한관리 신청자"])
plt.ylabel('찐한관리 여부',fontsize=12,rotation=360,labelpad=35)
plt.xticks(rotation=45)
plt.yticks(rotation=360)
plt.show()
결과 : 그래프 도출
* plt.yticks는 코드만 겹치지 않으면 중복 사용이 가능함 ex) rotation, labels 등
* plt.show()를 안넣어도 그래프가 도출은 되는데 굳이 기재된 이유는 아직 모르겠음
2-2-3) 결론 도출
최근 3개월간 찐한관리 신청 비율과 완주율이 모두 감소한 점을 보면 찐한관리를 받지 못한 인원이 많아 완주율이 떨어진게 아닌가 의심 -> 데이터 분석
찐한 관리를 받은 그룹의 수강율이 월등히 높은 것을 확인
수업 시작 전, 찐한관리 참여를 적극적으로 유도해봐도 좋을 것
2-3) 8월 2주차부터 3주차 강의 완주율이 떨어졌을 것 이다.
2-3-1) 데이터 전처리
2-3-1-1) 글자 타입을 날짜 타입으로 변경 필요
필요 데이터: sparta_data
필요 코드: info / format / datetime
* datetime?
괄호 안, 해당 열의 데이터를 날짜와 시간 데이터로 변경 해주는 함수
코드:
format='%Y-%m-%d' sparta_data['start_time'] = pd.to_datetime(sparta_data['created_at'], format=format,infer_datetime_format=True)
sparta_data.tail()
** ⇒ infer_datetime_format=True: datetime이 어떤 형식으로 이루어졌는지 확인 후 자동으로 변환 해주는 설정
결과:
오른쪽에 start_time 이라는 열(날짜 타입)이 새로 추가됨
2-3-1-2) 수강 시작 주 열 추가
필요 데이터: start_time
필요 코드: dt.isocalendar
코드:
sparta_data['start_week']= sparta_data['start_time'].dt.isocalendar().week
sparta_data.tail()
결과:
오른쪽에 week 라는 열(날짜 타입)이 새로 추가됨
*** .dt.isocalendar().week??
⇒ .dt.isocalendar().week ⇒ 날짜를 주(week) 로 변경 할수 있습니다.
week 대신, year 혹은 day으로 해당 날짜의 년도, 일자도 가져 올 수 있습니다.
year을 쓰면 연도가 출력됨
day 를 쓰면 0~로 요일이 표기됨 ( 0: Sunday ~ 6: Saturday )
2-3-1-3) 처음 수강 시작한 주 범위 확인
필요 데이터: start_week
필요 코드: set
코드:
category_range = set(sparta_data['start_week'])
category_range
결과:
{31~36}
2-3-2) 진도율을 강의 주차로 변경
필요 데이터 : start_week / progress_rate / bins / labels / cut
진도율 (0주차 : 0 ~4 .11% 1주차 : 4.12% ~ 26.03% 2주차 : 26.04% ~ 41.10% 3주차 : 41.11% ~ 61.64% 4주차 : 61.65% ~ 80.82% 5주차 : 80.83% ~ 100%)
2-3-2-1) 범주화 할 데이터 리스트 만들기
필요 데이터: progress_rate
필요 코드: list
코드:
progress_rate = list(sparta_data['progress_rate'])
결과:
100, 100, 36, 100, 100, 100, 71, 55, 67...
2-3-2-2) 범주를 구분하는 기준 및 라벨(수강 주차) 만들기
필요 데이터: 진도율
필요 코드: bins / labels
코드:
bins = [0,4.11,26.03,41.10,61.64,80.82,100]
labels=[0,1,2,3,4,5]
2-3-2-3) 진도율에 따라 주차별로 변경
필요 데이터 progress_rate
필요 코드 bins / labels / include_lowest / right / dataframe
코드:
cuts = pd.cut(progress_rate,bins, right=True,include_lowest=True, labels=labels)
cuts = pd.DataFrame(cuts)
cuts.tail()
결과:
2-3-2-4) 기존 테이블에 현재 수강 주차 테이블 합치기
필요 데이터 cuts / sparta_data
필요 코드 concat
코드:
#concat() 함수를 이용하여, sparta_data 테이블과, cuts 테이블 병합 할수 있습니다 :)
sparta_data = pd.concat([sparta_data,cuts],axis=1, join='inner')
sparta_data.head()
결과:
sparta_data 우측 열에 0열 5, 5,2,5,5,3,4,.... 이 추가됨
2-3-2-5) 테이블 컬럼(열) 이름 변경하기
변경 안했을 때 열은 0으로 표기됨 헷갈리므로 weeks로 변경하자
필요 데이터 sparta_data
필요 코드 columns
코드:
sparta_data.columns=['created_at','user_id','name','progress_rate','start_time','start_week',"week"]
sparta_data.head()
* 하나하나 열 이름을 처음부터 지정해줘야 오류 없이 이름 변경됨
2-3-3) 데이터 분석하기
2-3-3-1) 수강 시작 주와 수강 주차를 기준으로 테이블 만들기
필요 데이터 sparta_data
필요 코드 groupby
코드
grouping = sparta_data.groupby(['start_week','week'])
grouping.head()
결과
start_week','week가 grouping으로 묶임
2-3-2-6) 수강 시작 주와, 수강 주차에 각 해당하는 수강생 수 구하고, 테이블로 변경하기
필요 데이터 grouping
필요 코드 apply / daraframe
코드
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(sparta_data)
cohort_data.head(5)
해석
유저 아이디 별로 유니크한 데이터 값들을 코호트 데이터로 만들겠단 소리
*** cohort_data = grouping['user_id'].count() 를 못쓰는 이유
-> count() 는 NaN이 아닌 값을 세며, 중복된 값도 모두 포함함
-> apply(pd.Series.nunique)는 각 그룹에 대해 고유한 값의 개수를 계산함
결과
2-3-2-7) 수강 주차 별, 수강한 총 인원 구하기
현재 cohort_data는 31주차 0주 수강율 인 사람 5명 1주 수강율인 사람 14 이런식이다
원하는 데이터는
31주차
0주차를 총 몇명(5+14+14+16+14+167)이 수강했는지
1주차를 총 몇명(14+14+16+14+167)이 수강했는지 알아야한다
...
-> 수정 필요
필요 데이터 cohort_data
필요 코드 for문 / range / int / at
** at?
at() 함수를 이용하여 테이블의 하나의 요소에 접근 할수 있습니다 .
코드 (★ ★ ★ ★매우 중요)
#첫 주가 31주니 변수를 하나 만들어 줍니다!
f=31
#처음 수강 시작한 주의 범위가 {31,32,33,34,35,36} 이니, range(6)으로 합시다!
for i in range(6):
#5주차의 강의가 마지막이고, 0주차까지 이니, 시작은 5에서 시작해 1씩 0까지 감소 시킬수 있어요!
for j in range(5, 0, -1):
cohort_data.at[(f,j-1), 'user_id'] = int(cohort_data.at[(f,j),'user_id']) + int(cohort_data.at[(f,j-1),'user_id'])
#주차는(31부터 32 33..) 1씩 늘어나죠?
f=f+1
2-3-2-8) cohort_data에 인덱스 설정하기
필요 데이터 cohort_data
필요 코드 reset_index
코드
cohort_data = cohort_data.reset_index()
cohort_data.head()
결과
*** reset_index 란?
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
오류 해결 과정
데이터 분석 3주차 강의 자료를 확인해보면
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format='mixed')
sparta_data.tail(5)
이란 코드가 있는데 오류가 걸림 (12월 5일)
1차 해결 (12월 6일)
format='%Y-%m-%d %H:%M:%S'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format=format, errors='coerce')
sparta_data.tail(5)
문제점 : errors='coerce' 라는게 오류가 있어도 무시한다는 내용인데
이 방법을 계속 쓸 경우 추후 다른 오류를 야기할 수 있음을 확인!
2차 해결 (12월 18일)
# 날짜 형식 맞추는 함수 정의
def format_date(date_str):
try:
# strptime을 사용하여 날짜를 datetime 객체로 변환
date_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
# 원하는 형식으로 변환하여 반환
return date_obj.strftime("%Y-%m-%d %H:%M:%S")
except ValueError:
# 날짜 형식이 맞지 않으면 None을 반환
return None
문제점 : 이건 너무 돌아갔다? 애초에 초급반 수준(나)의 자료가 아닌 중/상급반 수준의 강의 자료가됨
그냥 안배워서 이해 자체가 안됨
문제점 추가 확인 (12월 18일)
문제점 : 코드를 적용했을 때 오류는 안나도 형식이 올바르지 못하덴다 이런!!!
4차 해결(12월 18일) 보스 레이드 성공!
근본적인 문제점 확인 !
: 배포된 엑셀 자료를 뜯어보면 access_date 의 날짜 형식이 다른 4개의 셀 있다는 것을 확인!
4개의 셀을 수정해주고 format='mixed' 도 수정해주자
기존 오류였던 코드
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'], format='mixed')
수정한 코드 (최종 오의)
format='%Y-%m-%d %H:%M:%S.%f'
sparta_data['access_date_time'] = pd.to_datetime(sparta_data['access_date'],infer_datetime_format=True)
** '%Y-%m-%dT%H:%M:%S.%f' / '%Y-%m-%d %H:%M:%S.%f' 둘 다 사용은 가능 엑셀 형식에 맞춰서 써주자
'본 캠프 TIL' 카테고리의 다른 글
12월24일 TIL (1) | 2024.12.24 |
---|---|
12월23일 TIL (4) | 2024.12.23 |
12월 20일 TIL (데이터 분석 복복습 완!/과제 완!) (6) | 2024.12.20 |
12월 17일 TIL (4) | 2024.12.17 |
12월 16일 TIL (2) | 2024.12.16 |