Challenge & Study 데이터 분석

데이터 분석 - 현업 데이터로 분석해보기 3-2 본문

데이터 분석 - Python/정리하자

데이터 분석 - 현업 데이터로 분석해보기 3-2

Factful_Day 2020. 8. 3. 23:57

**해당 데이터는 제가 학원 강의를 수료하며 받은 데이터이며 원본 데이터는 기업으로부터 제공받은 데이터라서 공유할 수 없습니다.
**본문은 공부를 하며 과정을 이해하며 생각하기 위함이니 참고 해주시면 감사드리겠습니다.

## Environment : Anaconda-navigator
## Programming Language : Python 3
## Import Pandas as pd
## import Numpy as np

## import seaborn as sns
## import matplotlib as mpl
## import matplotlib pyplot as plt
## Origin data has been provided by DS school
## DS School is a company that mentioned as below.

DS School 은 직무교육 스타트업으로 데이터 사이언스와 데이터 마케팅 수업을 진행하고 있습니다.

Target

  1. 데이터를 불러오기 및 전반적인 정보 확인
  2. 불러온 데이터들을 전처리
  3. 데이터 분석

데이터베이스에서 결제정보를 불러온 후 데이터 정리 및 분석을 진행해 보겠습니다.

# dsschool.db에 접속
connect = sqlite3.connect('dsschool.db')
connect

# dsschool.db에서 payments라는 테이블 모두 불러오기
query = "SELECT * FROM 'payments'"

# payments에 내용 인입
payments = pd.read_sql(query, connect)

# payments 변수에 할당된 데이터의 행렬(row, column) 사이즈를 출력
print(payments.shape)
# payments의 상단 5개 항목 확인
payments.head(5)

payments 테이블이 잘 불러와졌습니다.

개인정보 보호를 위해 연락처 정보는 비식별화 처리된 상태입니다.
결제창에서 수기로 연락처를 입력받아 수강생별로 연락처의 양식이 들쑥날쑥합니다.
이번에는 모든 연락처의 양식을 010-xxxx-xxxx으로 통일합니다.
단, 010으로 시작하지 않는 전화번호는 잘못 기입된 전화번호라고 가정하고 NaN값 처리하겠습니다.

# "010과 +82"로 시작하는 내용이 포함된 것들을 valid_phone_number 에 저장
valid_phone_number = (payments["연락처"].str.contains("^010|\+82"))
# "연락처"컬럼 "연락처(clean)"에 복사
payments["연락처(clean)"] = payments["연락처"]
# valid_phone_number의 조건에 부합하지 않다면 "연락처(clean)"컬럼상 내용을 np.nan으로 변경
payments.loc[~valid_phone_number, "연락처(clean)"] = pd.np.nan

# payments 변수에 할당된 데이터의 행렬(row, column) 사이즈를 출력
print(payments.shape)
# valid_phone_number의 조건에 부합하지 않는 내용 아래 두 컬럼에서 출력
payments.loc[~valid_phone_number, ["연락처", "연락처(clean)"]]

잘못된 연락처 정보들을 걸러냈습니다. 이제 연락처 양식을 정렬해보겠습니다.

def contact_format_setup(contacts):
    if pd.isnull(contacts): # null값이 들어가 있으면
        return pd.np.nan    # np.nan으로 출력
    
    if "-" in contacts:  # 만약 contacts에 "-"가 있다면
        return contacts  # 그대로 출력
    
    # 요청 형식에 맞춰 "-" 추가 후 출력
    else:
        contacts = contacts[:3] + "-" + contacts[3:7] + "-" + contacts[7:]
        return contacts
# 기존 컬럼에 contact_format_setup 적용
payments["연락처(clean)"] = payments["연락처(clean)"].apply(contact_format_setup)
# 내용 확인
payments["연락처(clean)"]

내용이 잘 적용되었습니다.

이번에는 신청수업 컬럼을 '수업타입'과 '기수'로 분리 후 새로운 컬럼을 만들어 보겠습니다.

# split 함수를 사용하여 신청수업 컬럼 내용의 여백을 활용하여 분리합니다
payments[['수업타입','기수']] = payments['신청수업'].str.split(expand=True)

# 내용 확인
payments[['신청수업','수업타입','기수']].head()

결제정보가 잘 정리되어 있지만, 분석을 진행하기 위해 처리해야할 사항이 남아있습니다. 
    
1) 신청날짜 컬럼을 datetime 자료형으로 만들겠습니다
2) 결제가 완료된 경우 True, 아닌 경우 False인 컬럼을 만들겠습니다

# '신청날짜'컬럼의 타입 변경
payments['신청날짜'] = pd.to_datetime(payments['신청날짜'])
# payments 컬럼들의 타입 확인
payments.dtypes

# '상태'컬럼에서 "결제 완료"라는 내용이면 True 아니면 False로 '상태(bool)'컬럼에 생성
payments['상태(bool)'] = payments['상태'] == "결제 완료"

# 상태(bool)컬럼의 가지수와 상태 확인
print(payments['상태(bool)'].value_counts())

# 두 컬럼의 상위 5개 내용 확인
payments[['상태','상태(bool)']].head()

새로운 컬럼이 조건에 맞춰 생성되었습니다.

결제 데이터에서 금액 정보를 정수형 (int)로 바꾸고 신청날짜 칼럼을 이용하여 월, 일, 요일, 시간 칼럼을 추가하겠습니다

# 금액 컬럼의 ','를 공백으로 대체하고 타입은 int로 변경합니다
payments['금액(int)'] = payments['금액'].str.replace(',', '').astype(int)
# 내용 확인
payments['금액(int)']

payments['신청날짜(연)'] = payments['신청날짜'].dt.year
payments['신청날짜(월)'] = payments['신청날짜'].dt.month
payments['신청날짜(일)'] = payments['신청날짜'].dt.day
payments['신청날짜(시)'] = payments['신청날짜'].dt.hour
payments['신청날짜(분)'] = payments['신청날짜'].dt.minute
payments['신청날짜(초)'] = payments['신청날짜'].dt.second
payments['신청날짜(요일)'] = payments['신청날짜'].dt.day_name()

payments.head()

결제 데이터를 바탕으로 요일별, 시간별 결제량의 차이를 구해보겠습니다.
DS School에서 주로 사용하고 있는 마케팅 채널인 페이스북은 시간, 요일대별 광고 노출빈도를 조절할 수 있는 기능이 있습니다.
기존의 결제 패턴을 분석해 결제가 특정 시간대에서 높게 일어난다면 해당 시간대에 더 많은 예산을 사용하는 것이 효율적일 것입니다.

# pivot table을 통해 요일별 원하는 값 출력
payments_pivot = payments.pivot_table(index = '신청날짜(요일)',
                                      values = '금액(int)',
                                      aggfunc = ['sum', 'count'])

# 월~일요일까지 순서와 값 정렬 후 day_name 변수 지정
day_name = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

# day_name 적용 내용 확인
payments_pivot.loc[day_name]

요일별 매출과 구매 횟수를 확인했습니다. 시간대별로 확인해보겠습니다.

# pivot table을 통해 시간대별 원하는 값 출력
payments_hour_pivot = payments.pivot_table(index = '신청날짜(시)',
                                           values = '금액(int)',
                                           aggfunc = ['sum', 'count'])

# 해당 변수의 row와 column 확인
print(payments_hour_pivot.shape)
# 내용 확인
payments_hour_pivot

시간대별 매출까지 확인 되었습니다.

다음 페이지에서는 본 환경을 이어서 분석을 진행하도록 하겠습니다.

*** 본 페이지는 본인의 공부를 위해 작성되었으며, 협찬이나 문의를 받고 기재한 내용이 아닙니다. 혹시 문의사항이 있으시거나 문제가 될 경우 연락 주시기 바랍니다.***