DB 공부하기
230309_DB복습
보랏
2023. 3. 9. 16:48
안녕하세요. 보랏입니다.
오늘은 어제에 이어서 지하철 이용객 데이터 전처리를
강사님께서 진행하신 내용과 통계의 관련된 기초 수업을 진행하였습니다.
바로 복습 시작하겠습니다.
1. 지하철 이용객 데이터 전처리(강사님 ver)
- 강사님께서 지하철 이용객 데이터 전처리를 진행해 주셨는데 어제 제가 진행한 방식에서 훨씬 간편한 방법으로 데이터 전처리를 진행해주셨습니다.
- 우선 지하철 데이터를 모두 가져와서 각 데이터별 컬럼을 확인하는 방법입니다.
import pandas as pd
import os
### 전체 데이터 파일 리스트에 담기
total= [pd.read_csv("./subway/{}".format(x), encoding = 'euc-kr') for x in os.listdir("./subway/")]
### 각 데이터별 컬럼 확인
for df in total :
print(df.columns)
print("-" * 50)
- 이 후 1~5월까지 데이터 결합, 6~11월까지 데이터 결합을 진행하였습니다. (이유는 어제자 블로그 내용에 작성하였습니다.)
- 이 때 저는 인덱스로 글자를 추출하여 새로운 컬럼을 만들었는데 강사님께서는 지난번에 배운 정규식을 통해 글자를 추출하였습니다 -> 이 방법이 정확성 측면에서 더 높을 것 같습니다.
### 1~5월까지 데이터 결합
df1 = pd.concat(total[:5])
#### 역번호 출력 (괄호번호 정규식으로 도출)
import re
p = re.compile("\(([0-9]+)\)")
p.findall("서울역(150)"] #['150']
### apply, lambda 함수로 역변호 컬럼 생성
df1['역번호'] = df1['역명'].apply(lambda x : p.findall(x)[0])
df1['역명'] = df1['역명'].apply(lambda x : p.sub("",x)) #역명에 괄호 숫자 삭제
### 공백문자 삭제
df1.columns = df1.columns.str.replace(" ","")
### 컬럼순서 변경
df1 = df1[['날짜', '호선', '역번호','역명', '구분', '할인', '04~05', '05~06', '06~07', '07~08',
'08~09', '09~10', '10~11', '11~12', '12~13', '13~14', '14~15', '15~16',
'16~17', '17~18', '18~19', '19~20', '20~21', '21~22', '22~23', '23~24',
'00~01', '01~02', '02~03', '03~04']]
### group by 사용 합계
df1_1 = df1.groupby(['날짜', '호선', '역번호', '역명', '구분'], as_index =False).sum().copy()
df1_1
- 정규식.sub('패턴', '바꿀 문자열') : 문자열의 정규식 값을 어떤 '패턴'으로 바꿀건지 설정
- 예) p = re.compile("\(([0-9]+)\)") / p.sub("", '서울역(150)') -> 서울역
- 이와 같이 6~11월, 12월까지 모두 같은 방식으로 진행하였습니다.
### 6~11월 데이터 결합
df2 = pd.concat(total[6:11])
### 역번호, 역명 변경
df2['역번호'] = df2['역명'].apply(lambda x : p.findall(x)[0])
df2['역명'] = df2.역명.apply(lambda x : p.sub("",x))
### 데이터 컬럼 차이 확인
set(df1_1.columns) - set(df2.columns) # {'02~03', '03~04', '04~05'}
### df1_1에서 차이가 있는 컬럼 제거
df1_1.drop(['02~03', '03~04', '04~05'], axis=1, inplace=True)
### 12월 데이터 확인
df3 = total[-1].copy()
df3['역번호'] = df3.역명.apply(lambda x : p.findall(x)[0])
df3['역명'] = df3.역명.apply(lambda x : p.sub("", x))
### 컬럼별 '시'문자열 삭제
df3.columns = df3.columns.str.replace("시", "")
- 이렇게 각 데이터별 컬럼을 맞춘 다음에 1월부터 12월까지 모든 데이터를 결합하였습니다.
- 그 후, 홍대입구역 월별 승하차객을 비교한 후 이를 시각화까지 하는 작업을 진행하였습니다.
### 1~12월 데이터 결합
subway = pd.concat([df1_1, df2, df3], ignore_index= True)
### 시간대별 합계(column기준), axis = 0
### 역별 합계(row기준), axis =1
subway_ana = pd.DataFrame(subway.groupby(['역명', '구분']).sum().apply(sum, axis =1), columns = ['총합'])
### 인덱스 조정
subway_ana.reset_index(inplace = True)
### 총계 확인
"{:,}".format(subway_ana.총합.sum()) #'2,010,968,780'
### 홍대입구역 데이터 추출
홍대 = subway[subway.역명 == '홍대입구'].copy()
홍대['월'] = 홍대.날짜.apply(lambda x : x.split("-")[1]) # 날짜 컬럼 중 월 데이터 추출
### 월별, 승하차 합계 데이터 생성
홍대승하차 = 홍대.groupby(['월', '구분']).sum().apply(sum, axis =1)
### 홍대승하차 데이터프레임 생성
# 데이터 생성 시 이미 데이터에 groupby로 월, 구분이 인덱스값으로 들어가 있어 columns에 총합컬럼만 추가해도됨
홍대승하차 = pd.DataFrame(홍대승하차, columns = ['총합'])
### seaborn 라이브러리 활용 시각화
import seaborn as sns
sns.barplot(x = '월', y = '총합', data = 홍대승하차, hue = '구분')
- 이제 이렇게 전처리를 진행한 데이터를 활용하여 지난번 AWS에 만든 RDS에 적재를 하였는데, 그 전에 전철역코드와 연결하기 위해 서울교통공사 노션별 지하철역 정보.csv파일을 불러왔습니다.
import sqlalchemy
### 엔진 생성
engine = sqlalchemy.create_engine("mysql+pymysql://admin:newjeans@encore.cluster-cd9ecw5piy57.ap-northeast-2.rds.amazonaws.com/encore")
subway = pd.read_sql_query("select * from subway", con = engine)
### 서울교통공사 노선별 지하철역 정보.csv파일 불러오기ㅣ
master = pd.read_csv("./서울교통공사 노선별 지하철역 정보.csv", encoding = 'cp949')
master.전철역코드
### subway중 코드 데이터 추출
subway.code_ = subway.code_.apply(lambda x : str(x).zfill(4))
### subway와 master 데이터 결합
pd.merge(subway, master[['호선', '전철역코드']], left_on = 'code_', right_on = '전철역코드', how = 'left')
2. 2차원 데이터의 정리
- 상관관계
- 양의 상관관계 : A가 높을수록 B가 높은 경향이 있는 관계
- 음의 상관관계 : A가 높을수록 B가 낮은 경향이 있는 관계
- 무상관관계 : A와 B가 직접적으로 영향이 미치지 않는 관계
- 공분산
- 데이터의 관계성을 수치로 표현하는 정보
- 공분산은 분산에 가까운 지표로 흔히 S_xy로 표현
- numpy의 경우, 공분산은 cov함수로 구할 수 있으며, 다만 반환값은 공분산값이 아닌 공분산 행렬 또는 분산공분산 행렬이라고 부름
- 상관계수
- 공분산을 계산하여 데이터의 상관관계를 표현
- 같은 시험 점수들 간에 공분산은 (점수 x 점수)라는 단위를 사용
- 학생의 키와 시험 점수의 상관관계를 살펴보면, 공분산이라는 단위가 나옴
- 분산의 경우와 마찬가지로 이런 단위는 직감적으로 이해하기 어려운 단점 존재
- 상관계수는 반드시 -1과 1사이의 값을 취하고, 데이터가 양의 상관관계에 있을수록 1에 가까워지고, 음의 상관관계일수록 -1에 가까워짐
오늘 배운 내용은 많지는 않았고, 또 강사님 개인자료가 포함되어 있어 여기까지 복습하도록 하겠습니다.
내일은 복습하는날이기 때문에 복습 내용은 안올라가고,
던파 던담 거너(남) 내용 올리도록 하겠습니다.
감사합니다.