da-ta ta-da

데이터 분석 인강 4주차 : 마케팅 데이터 분석 본문

Data Analyst

데이터 분석 인강 4주차 : 마케팅 데이터 분석

jess1015 2022. 5. 15. 20:51

1. 마케팅 데이터 분석

- 광고 지표 종류: CTR(click/impression), CPM(cost/impression*1000), CPC(cost/click), CPA(cost/action)

- matplotlib을 통해 광고 데이터 시각화 

- 막대 그래프: df.plot.bar(), 가로 막대 그래프: df.plot.barh()

- 히스토그램: df.plot.hist(bins = range(최소값, 최대값, 단위)

- 차트 옵션: figsize[], fontsize,

- 구성 요소 추가: plt.title("타이틀명"), plt.xlabel("x축 라벨"), plt.ylabel("y축 라벨"),

  plt.xticks(), plt.yticks() ⇒ x, y축 단위 설정

  용례) plt.xticks([0, 1, 2, 3], ['첫째', '둘째', '셋째', '넷째', rotation = 0)

  plt.xlim([]), plt.ylim([]) ⇒ 그래프에 나타낼 x, y축 범위 설정

 

2. 검색 광고 데이터 분석

- 검색 광고 데이터를 pandas로 불러와 중점 관리, 저효율 광고를 키워드 및 광고 그룹 단위로 분석할 수 있다.

- 분석 과정은 데이터 전처리, 데이터 탐색, 시각화, 데이터 분석으로 진행된다.

1) 데이터 전처리

  - 데이터를 전처리하여 컬럼별 데이터를 다루기 좋게 재정의한다.

  (1) read_excel을 통해 검색 광고 데이터 불러오기: df.read_excel 함수 사용

    - Window의 경우 '\'로 디렉토리가 구분되어 있으므로, 파이썬의 구분자인 '/'로 변경해주거나, \를 하나 더 붙여주거나, 경로 앞에 'r'을 추가하여 불러올 수 있다.

    - skiprows argument를 추가하여 사용하지 않는 행을 삭제해준다. skiprows = 5 ; 5번째 행부터 출력, skiprows = [0] 1번째 행을 제외하고 출력

  (2) 결측치 확인: df.isnull() 함수 사용

    - df.isnull(): 자체로는 boolean 값으로 반환이 되어 null 값을 알기 어려움

    - df.isnull().sum(): 열 단위로 sum을 해서 해당 열의 데이터 중 null 값이 없는지 확인

    - df.isnull().sum(axis = 1): 행 단위 결측치 확인

  (3) 데이터 프레임 열 단위 수치 연산 및 데이터 타입 변경

    - 소수 값을 반올림하고, 정수로 반환: round(column명, n), .astype(int) 사용

    - round의 두 번째 argument는 어느 자리에서 반올림할지 결정하는 값

2) 데이터 탐색

  (1) 데이터 탐색에 자주 사용되는 함수: head(), tail(), shape, describe(), columns, index...

    - unique() 컬럼 데이터의 고유값들

    - len과 unique를 같이 사용하면 컬럼 내 데이터 종류 수를 파악할 수 있다.

    - pd.set_option('display.float_format', {:.2f}'.format) ⇒ pandas에서 데이터를 불러올 때 항상 float 소수점 2자리 형식으로 불러온다.

    - value_counts() ⇒ 열 데이터 고유값의 빈도 확인

    - sort_values() ⇒ 정렬, 기본 오름차순. 내림차순은 sort_values(ascending = False)

3) 시각화를 통한 데이터 탐색 실습

  (1) 패턴을 갖는 데이터 시각화

    - 데이터의 패턴을 확인할 수 있도록 특정 기준을 두고 정렬해준다.

    - sort_value()를 통해 오름차순/내림차순으로 데이터를 정렬하고 

    - reset_index()으로 함수 index를 재정의해준다.

    - index를 재정의할 경우 기존의 index명이 column으로 생성되므로 해당 column은 drop()을 통해 제거해준다. drop('삭제할 index명', axis = 1), 해당 값을 유지할 경우 'inplace = True' argument를 추가한다.

  (2) 시각화된 데이터를 통해 분석할 데이터 선정하기

    - 시각화된 데이터를 통해 중점 관리 키워드 및 저효율 키워드의 조건을 정의 (ex. 중점 관리: imp, click 상위 5%, 저효율: 노출수 하위 95%, 클릭수 하위 95%, 총비용 상위 15% 이상, 상위 5% 미만)

  (3) 데이터 분석

    - 중점 관리 키워드 및 저효율 키워드의 조건을 quantile() 함수로 걸어준다. quantile은 분위수를 출력해주는 함수

    - 분석할 property가 index가 되도록 set_index 함수를 통해 index를 재정의해준다. df.set_index('키워드')

    - groupby 함수를 통해 동일한 광고 그룹 내 키워드를 묶어서 광고 그룹별로 분석하기

grouped = df.groupby('광고그룹')  # grouped 출력 시 객체 정보만 출력되며, 데이터를 사용하기 위해서는 집계 함수를 사용해야 한다. excel의 pivot table 값 필드 설정 개념
df_group = grouped_sum() # 동일 그룹 내 키워드 값이 합계로 나타나므로, CTR, CPC column은 전처리해야 한다.
df_group['CTR'] = df_group['클릭수'] / df_group['노출수']
df_group['CPC'] = df_group['총비용'] / df_group['클릭수']
df_group[df_group['클릭수' == 0] # 위 계산에서 클릭 수가 0일 경우 결측치가 발생한 것을 알 수 있다. 
df_group['CPC'] = df_group['CPC'].fillna(0) # 평균 클릭 비용 중 결측치가 생긴 데이터를 fillna 괄호 안의 값으로 대체해준다.
df_group['CPC'] = round(df_group['CPC'], 0).astype(int)

    - 중점관리 광고그룹 광고 그룹 조건 걸기

# 노출수 상위 20% 이상, 클릭수 상위 10% 이상 
imp = df_group['노출수']
clk = df_group['클릭수']
result = df_group[(imp >= imp.quantile(0.8)) & (clk >= clk.quantile(0.9))]
result.index # 중점 관리 광고 그룹 출력

3. 고객 데이터 분석

- bank client data로 고객 데이터 분석하기

- pd.read_csv 로 파일 불러오기, 디렉토리나 파일명에 한글이 있을 경우 engine = 'python' 파라미터를 추가해준다.

- age 데이터 10 단위로 끊어 확인하기 (hist plot)

# age 오름차순으로 정렬하고 히스토그램 만들기
age = ((df['age'].sort_values()).reset_index()).drop('index', axis = 1) 
age.plot.hist(bins = range(10, 101, 10) # range(x축 최소값, x축 최대값, 단위)
plt.show()

- obeject value로 이루어진 데이터 그래프 그리기

marital = df['marital'].value_counts() # value가 object면 value_counts를 활용
marital.plot.barh()
plt.show()

  1) 분석 주제: 대출 여부와 은행 상품 가입 데이터간 관계

    - 가입 여부에 따라 그룹핑하고 대출 여부에 따라 한번 더 그룹핑, groupby(), get_group() 함수 활용

# 상품 가입 여부(y)에 따라 그룹화 
grouped = df.groupby('y')
yes_group = grouped.get_group('yes') # y column에서 yes value를 가진 row 그룹화
no__group = grouped.get_group('no') # y column에서 no value를 가진 row 그룹화

# 위 그룹들의 loan column 응답 빈도 출력
yes = yes_group['loan'].value_counts()
no = no_group['loan'].value_counts()

# 상품 가입 여부에 따라 loan 응답 비중 확인 
yes = yes / yes.sum() 
no = no / no.sum()
yes.name = 'y_yes' # 시리즈의 이름 설정, 열 방향으로 결합했을 때 column명이 된다.
no.name = 'y_no' 
pd.concat([yes, no], axis = 1) # 열 방향으로 결합하기

  2) 분석 주제: 연령, 상품 가입 여부, 직업 간 관계 분석

    - pivot table 기능을 사용, pd.pivot_table(데이터프레임명, 값, index, column, aggfunc)이 기본 파라미터. aggfunc은 값을 나타낼 계산 방법을 입력

# pivot table을 활용하여 세 개의 column age, job, y를 분석
pd.pivot_table(df, values = 'age', index = 'y', columns = 'job', aggfunc = 'mean')

# cf) multie index, index와 column을 멀티로 넣을 수도 있다
pd.pivot_table(df, 'age', ['y', 'marital'], ['job', 'education'], aggfunc = 'mean')

pd.pivot_table(df, values = 'age', index = 'y', columns = 'job', aggfunc = 'mean', fill_value = 0) # 결측치 0으로 대체

# 은행 상품을 가입한 사람과 가입하지 않은 사람의 연령 차이 구해서 diff 행으로 추가
pivot.loc['diff'] = pivot.loc['yes'] - pivot.loc['no']
result = pivot.sort_values('diff', axis = 1, ascending = False) # diff 기준으로 내림차순 정렬
result.loc['diff].plot.bar(figsize = (15, 10))
plt.show()
Comments