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에 가까워짐

 

 

오늘 배운 내용은 많지는 않았고, 또 강사님 개인자료가 포함되어 있어 여기까지 복습하도록 하겠습니다. 

내일은 복습하는날이기 때문에 복습 내용은 안올라가고,

던파 던담 거너(남) 내용 올리도록 하겠습니다.

 

감사합니다.