일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- cross join
- 전처리
- data analyst
- 서브쿼리
- SQLD
- 군집화
- 태블로
- lambda
- 기초통계
- 데이터 분석
- 클러스터링
- 데이터분석
- jd
- 최종 프로젝트
- SQL
- 시각화
- GA4
- Python
- 기초프로젝트
- 프로젝트
- streamlit
- 머신러닝
- da
- 크롤링
- 팀프로젝트
- If
- pandas
- 히트맵
- 프롬프트 엔지니어링
- Chat GPT
- Today
- Total
세조목
TIL(Today I Learned) 1일차(23.11.28) 본문
DID LIST
- PYTHON 데이터 분석 5주차 복습
- SQL 예제 풀이(1번~8번)
- SQLD 1주차 강의 수강
1. PYTHON 데이터 분석 5주차 복습
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.rc('font', family='NanumBarunGothic')
sparta_data = pd.read_table('파일경로',sep=',')
sparta_data.tail()
format='%Y-%m-%dT%H:%M:%S.%f'
sparta_data['start_time'] = pd.to_datetime(sparta_data['created_at'], format=format,infer_datetime_format=True)
sparta_data.tail()
sparta_data['start_week']= sparta_data['start_time'].dt.isocalendar().week
sparta_data.tail()
category_range = set(sparta_data['start_week'])
category_range
progress_rate = list(sparta_data['progress_rate'])
progress_rate
bins = [0,4.11,26.03,41.10,61.64,80.82,100]
labes=[0,1,2,3,4,5]
cuts = pd.cut(progress_rate,bins, right=True,include_lowest=True, labels=labes)
cuts
cuts = pd.DataFrame(cuts)
cuts.tail()
sparta_data = pd.concat([sparta_data,cuts],axis=1, join='inner')
sparta_data.head()
sparta_data.columns=['created_at','user_id','name','progress_rate','start_time','start_week',"week"]
sparta_data.head()
grouping = sparta_data.groupby(['start_week','week'])
grouping.head()
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
cohort_data.head(10)
k=31
for i in range(6):
for j in range(5, 0, -1):
cohort_data.at[(k,j-1), 'user_id'] = int(cohort_data.at[(k,j),'user_id']) + int(cohort_data.at[(k,j-1),'user_id'])
k=k+1
cohort_data = cohort_data.reset_index()
cohort_data.head()
cohort_counts = cohort_data.pivot(index="start_week",
columns="week",
values="user_id")
cohort_counts
retention = cohort_counts
cohort_sizes = cohort_counts.iloc[:,0]
cohort_sizes.head()
retention = cohort_counts.divide(cohort_sizes, axis=0)
retention
retention.round(3)*100
w=31
for i in range(6):
for j in range(5, 1, -1):
retention.at[(w,j)] = retention.at[(w,j)]/retention.at[(w,j-1)]
w=w+1
retention
plt.figure(figsize=(10,8))
sns.heatmap(data=retention,
annot=True,
fmt='.0%',
vmin=0,
vmax=1,
cmap="BuGn")
plt.title('개강일별 주차 간 전환율', fontsize=20)
plt.xlabel('주차', fontsize=14,labelpad=30)
plt.ylabel('개강일', fontsize=14,rotation=360,labelpad=30)
plt.yticks(rotation=360)
plt.show()
Q.1
progress_rate = list(sparta_data['progress_rate'])
진도율 행렬데이터를 목록형 데이터로 바꾸지 않아도 이후에 진행되는 코드 작성에 영향을 주지 않는데도 해당 코드를 작성하는 이유가 무엇인지?
A.1
필수적으로 넣어야 하는건 아니다.
Q.2
cohort_data = grouping['user_id'].apply(pd.Series.nunique)
cohort_data = pd.DataFrame(cohort_data)
cohort_data.head(5)
코드 중 grouping['user_id'].apply(pd.Series.nunique) 에 대한 구체적인 설명
pd.Series는 apply 없이는 사용할 수 없는 것인가?
A.2
'grouping 변수 안에 있는 'user_id'컬럼의 값을 컬럼이 있는 형태로 값의 중복없이 표현해라' 라는 의미임
apply( ) 함수는 apply 안에 있는 데이터를 어떻게 적용할 것인가에 대해서 명시해주는 역할을 한다.
Q.3
cohort_data = cohort_data.reset_index()
cohort_data.head()
코드에서 reset_index( ) 를 사용하는 이유
A.3
cohort_data 에서 컬럼인 값을 확인해보면 'user_id'밖에 없다.
'start_week'와 'week'도 컬럼이었다면 'user_id'와 함께 나왔어야 한다.
반대로 cohort_data.index를 입력하면 names=['start_week', 'week']로 출력되는 것을 볼 수 있는 이 말인즉슨
'start_week'와 'week'는 index로 사용되고 있다는 말이다.
그래서 'start_week'와 'week'를 데이터 항목으로 변경시켜주기위해 reset_index( ) 함수를 이용한 것이다.
Q. 4
f=31
for i in range(6):
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'])
f=f+1
코드에서 두번째 줄 i의 용도는?
A.4
i는 f의 값을 변경하는데에 사용된다.
range(6)이라는건 0에서부터 5까지 총 6번 f=f+1을 수행하는 것을 의미한다.
Q. 5
for i in range(6):
for j in range(1, 6, 1):
retention.at[(w, j)] = retention.at[w,j] / retention.at[w,j-1]
w=w+1
w가 31, j가 1일 때의 값을 구하려면 아래와 같은 코드를 입력해야하는데
retention.at[(31,1)] = retention.at[31,1] / retention.at[31,0]
0번째(31,0)는 있을수가 없는 값이니 첫번째(31,1)와 같은 값으로 나눠줘서 값이 1.0이 나오는것인가
0주차는 그러면 어떻게 계산이 돼서 1.0이라는 숫자가 나오는건가?
fo j in range( )에 1, 6, 1이 들어간다면 'retention.at[(w,0)]' 값은 어떻게 구하는건가?
0주차의 1.0이라는 값이 어떤 산식에 의해서 나온건지 궁금하다.
A.5
range(1, 6, 1)에서 1과 6은 첫번째, 여섯번째를 의미한다.
retention[(w, 1), 'user_id']의 경우 w번째 주에 시작한 사람의 첫번째 주차를 의미한다.
python에서는 가장 처음 나오는 순서를 0으로 표시하는데 이 부분을 놓치고 있었기때문에 헷갈렸던 것이다.
2. SQL 예제 풀이
※ limit함수는 행을 원하는만큼만 출력할 수 있게 해준다.
3. SQLD 1주차 강의 수강
1) DATA의 개념: 저장이나 처리에 효율적인 형태로 변환된 정보
2) DB의 개념: 잘 조직화된 데이터의 모음
※ 엑셀(or 스프레드시트)만으로 데이터를 관리할 수 없는 이유
- 엑셀에 저장할 수 있는 데이터의 양이 한정되어있다.
- 보안 취약성
- 데이터 무결성을 보장할 수 없다.
* 데이터 무결성 => 데이터에 흠이 없다.
3) DBMS의 개념: DB에 모아놓은 Data들을 관리하는 프로그램으로 SQLite, MySQL, ORACLE등이 있다.
※ SQL은 DB를 조작하는 언어이므로 위에서 언급한 DBMS들은 SQL을 활용하여 조작한다.
'데이터 분석 공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL(Today I Learned)6일차(23.12.05) (4) | 2023.12.05 |
---|---|
TIL(Today I Learned) 5일차(23.12.04) (0) | 2023.12.04 |
TIL(Today I Learned) 4일차(23.12.01) (2) | 2023.12.01 |
TIL(Today I Learned) 3일차(23.11.30) (2) | 2023.11.30 |
TIL(Today I Learned) 2일차(23.11.29) (1) | 2023.11.29 |