그로스 마케팅에서의 그래프 사용, 데이터 변환의 중요성
그래프가 각각 사용되는 이유와 목적을 명확히 알아야 한다.
그로스 마케팅 관점에서 각각의 그래프에 대한 사용목적
히스토그램 (Histogram)
- 데이터의 분포를 분석
활용사례
- 특정 캠페인의 광고 클릭 수 분포를 분석
- 고객별 구매 금액의 빈도 분포를 분석
선형 그래프 (Line Chart)
- 데이터의 시간적 변화를 시각화
활용사례
- 특정 마케팅 캠페인의 주간/월간 매출 트렌드를 분석
- A/B 테스트 결과를 시간별로 비교
- 지난 6개월간의 월별 매출 변화(Revenue Trend) 를 분석하여 매출이 증가하는 시기와 감소하는 시기를 파악할 때
- 신규 가입자의 월별 유지율(Retention Rate) 을 분석하고, 특정 월에 이탈율이 증가하는지 확인할 때
막대 그래프 (Bar Chart)
- 범주형 데이터의 비교
활용사례
- 광고 채널별 전환율 비교 (Google, Facebook, Instagram 등)
- 제품군별 매출 분석을 통해 ROI(Return on Investment)가 높은 제품 파악
산점도 (Scatter Plot)
- 두 변수 간 상관관계를 시각적으로 볼 때
활용사례
- 광고 비용이 전환율 상승과 직접적인 관계가 있는지 분석
- 고객 세그먼트(VIP, Regular)에 따른 광고 클릭 수와 전환율 간 차이
파이 차트 (Pie Chart)
- 비율(퍼센트) 비교
활용사례
- 신규 고객의 유입 경로(SEO, SNS, 유튜브 광고 등) 비율 분석하여 가장 효과적인 채널 파악.
- 고객의 구독 모델 vs 1회성 구매 비율을 분석.
- 신규 고객이 SEO, 유튜브 광고, SNS, 이메일 마케팅 중 어떤 채널을 통해 유입되었는지 비율을 분석
박스 플롯 (Box Plot)
- 데이터의 분포와 이상치(Outlier) 감지
활용사례
- 광고 캠페인별 CPC(클릭당 비용) 또는 CPA(전환당 비용) 변동성을 분석
- 고객별 평균 구매 금액의 이상치를 분석
- VIP 고객과 일반 고객의 평균 구매 금액 비교. 일부 고객이 매우 높은 금액을 소비하는지 확인할 때
- 광고 캠페인에서 일반적인 클릭당 비용(CPC)보다 너무 높은 비용이 발생한 캠페인을 감지하려 할 때
박스 플롯에서의 이상치
- 평균에서 너무 멀리 떨어진 데이터 포인트
- 박스 플롯 바깥쪽의 점으로 표시
히트맵 (Heatmap)
- 다차원 데이터 간의 관계를 시각화
활용사례
- 특정 시간대별 광고 성과 분석
- 고객 세그먼트별 이탈률(Churn Rate) 분석
- 쇼핑몰의 랜딩 페이지에서 방문자들이 어느 버튼을 가장 많이 클릭하는지 분석
- 웹사이트에서 방문자들이 가장 많이 클릭하는 페이지 영역을 분석
- 온라인 쇼핑몰에서 고객들이 가장 많이 구매하는 시간대를 분석
데이터 변환의 중요성
데이터 변환을 통해 데이터 품질을 개선하고,
비즈니스 인사이트를 도출할 수 있다. (특징을 쉽게 뽑을 수 있다)
데이터 변환 기법
1. 데이터 정제 - 결측값과 이상치를 처리하여 신뢰성 있는 데이터 확보
- 결측값이 있으면 평균값 또는 중앙값으로 대체
- 이상치(극단값)는 제거하거나 다른 값으로 조정
- BLANK는 값이 있지만 빈 상태(공백 문자열), NULL은 값 자체가 존재하지 않는 상태
결측치 확인하기 - isnull() 함수
isnull() 함수는 데이터프레임(DataFrame) 또는 시리즈(Series)에서 결측치(NaN)를 확인할 수 있다. 결과는 각 값이 결측치인지(True) 또는 아닌지(False)를 나타내는 불리언(Boolean) 값으로 반환된다.
import pandas as pd
import numpy as np
data_example = {
"User ID": [1, 2, 3, 4, 5],
"Ad Clicks": [10, np.nan, 25, 30, np.nan], # 일부 결측치 포함
"Conversion Rate": [0.05, 0.07, np.nan, 0.12, 0.09], # 일부 결측치 포함
"Revenue": [1000, 2000, np.nan, 4000, 5000] # 일부 결측치 포함
}
# 데이터프레임 생성
df_example = pd.DataFrame(data_example)
# 결측치 확인 코드
missing_values_example = df_example.isnull().sum()
# 데이터 및 결측치 개수 출력
print("Example Dataset:")
print(df_example)
print("\nMissing Values Count:")
print(missing_values_example)
결측치를 컬럼별로 몇개인지 0 또는 1로 변환하여 출력한 것을 확인할 수 있다.
nan = not a number > 결측치라는 의미
위 내용을 fillna()를 이용해 결측치가 있는 컬럼의 평균값으로 결측치를 대체할 수 있다.
※ inplace = True는 pandas에서 데이터 프레임을 수정할 때, 원본 객체를 직접 변경하도록 설정하는 옵션
원본이 바로 변경되므로, 복구가 어렵기 때문에 안전한 방법은 원본을 유지하고 새로운 객체 만드는게 좋다.
isnull() 함수는 결측값 확인! fillna() 함수는 결측값을 메꿀때! (평균값 혹은 중앙값으로 대체)
inplace = True 방법 말고 새 객체 만들어서 진행한 예시
결측치 처리하기 (평균값 혹은 중앙값으로 대체) - fillna() 함수
fillna() 함수는 주로 데이터셋에 NaN 값이 있을 때 그 값을 적절한 값으로 채우기 위해 사용.
평균값으로 처리하는게 일반적이지만 데이터의 순서가 중요할 때는 중앙값으로 대체한다.
평균값으로 대체해야 할 때 - 이상치가 적고 정규분포를 따르는 경우
중앙값으로 대체해야 할 때 - 이상치가 많은 경우
import pandas as pd
import numpy as np
# 예제 데이터 생성
data = {
"Age": [25, 30, np.nan, 40, 35], # 결측값 포함
"Ad Influence": [5, np.nan, 3, 4, 5], # 결측값 포함
"Product Satisfaction": [np.nan, 4, 3, 5, 4] # 결측값 포함
}
df = pd.DataFrame(data)
# 결측값을 평균으로 대체
df.fillna(df.mean(), inplace=True)
print(df)
※ csv 파일을 불러와서 결측치 여부를 확인하고, 결측치를 평균값으로 대체하기.
2. 데이터 타입 변환
- 문자열을 숫자로 변환 (예 : yes를 1, no를 0으로 바꾸기) - map() 함수 사용
- 날짜 데이터를 변환하여 분석 가능하도록 변경 - pd.to_datetime() 함수 사용
pd.to_datetime() 함수는 문자열이나 다른 형식의 데이터를 날짜/시간 형식으로 변환해준다. 이 함수를 사용하면 datetime 객체로 변환되어 날짜 계산, 비교 등 다양한 작업을 할 수 있다.
# 광고 시청 여부를 0과 1로 변환
df["Ad Viewed"] = ["Yes", "No", "Yes", "No", "Yes"]
df["Ad Viewed"] = df["Ad Viewed"].map({"Yes": 1, "No": 0})
# 날짜 데이터 변환
df["Survey Date"] = pd.to_datetime(["2024-02-01", "2024-02-02", "2024-02-03", "2024-02-04", "2024-02-05"])
print(df["Ad Viewed"])
print(df)
다른 예시 (map()함수를 사용해서 yes, no를 1과 0으로 맵핑)
다른 예시 (날짜 데이터를 요일로 변환)
3. 범주형 데이터 변환
- 레이블 인코딩(Label Encoding): 범주형 데이터를 숫자로 변환
- 원-핫 인코딩(One-Hot Encoding): 범주형 데이터를 여러 개의 이진(0/1) 컬럼으로 변환 - bool 타입으로 변환
레이블 인코딩 / 원-핫 인코딩 예시
레이블 인코딩 : LabelEncoder() 함수 - sklearn의 preprocessing 모듈에 있는 클래스.
- fit_transform()을 사용하면 categories 리스트에 있는 각 값을 숫자로 변환.
- fit()은 데이터를 학습시키고, transform()은 실제로 데이터를 변환하는 역할.
원-핫 인코딩 : get_dummies() 함수 - 판다스에서 사용가능
- pd.get_dummies()는 각 범주에 대해 별도의 열을 만들고, 해당 값이 존재하는 위치에만 1을 넣어준다.
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
# 예제 데이터 생성 (결측값 포함)
data = {
"User ID": [101, 102, 103, 104, 105],
"Age": [25, 30, np.nan, 40, 35], # 결측값 포함
"Ad Clicks": [10, 50, 35, 30, 60],
"Conversion Rate": [0.02, 0.05, 0.03, 0.04, 0.07],
"Ad Influence": [5, np.nan, 3, 4, 5], # 결측값 포함
"Product Satisfaction": [np.nan, 4, 3, 5, 4], # 결측값 포함
"Campaign": ["YouTube Ad", "SNS Ad", "Search Ad", "Email Marketing", "SNS Ad"]
}
df = pd.DataFrame(data)
# 결측값을 각 컬럼의 평균으로 대체
df.fillna(df.mean(numeric_only=True), inplace=True)
# 레이블 인코딩 (Campaign을 숫자로 변환)
le = LabelEncoder()
df["Campaign_Encoded"] = le.fit_transform(df["Campaign"])
# 원-핫 인코딩 적용
df_one_hot = pd.get_dummies(df, columns=["Campaign"])
# 최종 결과 출력
print(df_one_hot)
```
원래 pd.get_dummies()를 사용하면 기본적으로 0/1의 숫자 형태로 변환되어야 하는데, True/False 값으로 나온 이유는 dtype 때문일수도 있다고 함... 버전에 따라 또는 판다스의 내부 동작 방식이 변경되면서 일부 환경에서는 True/False 형태로 나올 수 있다는 gpt 피셜....음.....
4. 데이터 스케일링
광고 영향도, 제품 만족도 등 연속형 변수는 범위가 다를 수 있다.
따라서 모델 학습과 비교를 위해 정규화(Normalization) 또는 표준화(Standardization) 적용이 필요하다.
정규화란 ?
데이터를 0과 1 사이의 범위로 변환하는 기법 (대표적인 방법: Min-Max Scaling (최소-최대 정규화))
최소값을 0, 최대값을 1로 변환
데이터의 형태(비율, 관계)는 유지하면서 값의 크기만 조정한다.
작은놈은 벌리고 큰놈은 쪼그라트리고...(예 : 카메라 배율조정)
작은 값들은 더 차이가 도드라지게 조정(벌림).
큰 값들은 너무 차이가 심하지 않도록 줄여줌(쪼그라뜨림).
즉, 정규화는 데이터를 더 보기 쉽게 스케일링 하는 과정이다..
[5, 10, 50, 100]
- 정규화를 하면 최소값(5)은 0, 최대값(100)은 1로 변환되고, 나머지 값도 비율에 맞춰 바뀜.
Min-Max 정규화 적용 후:
[0.00, 0.05, 0.50, 1.00]
- 작은 값(5, 10) 사이의 간격은 넓어짐 → 작은 놈은 벌린다
- 큰 값(50, 100)의 차이는 줄어듦 → 큰 놈은 쪼그라뜨린다
표준화란?
데이터를 평균 0, 표준편차 1을 가지도록 변환하는 기법
표준화를 수행하면 데이터가 평균 0을 중심으로 분포되며, 이상치의 영향을 줄이는 효과가 있다.
(정규화와 표준화는 이해하기 너무 어려워서 따로 찾아보거나... 강사님 수업을 더 들어보도록 하자...)
예시 코드
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[["Ad Influence", "Product Satisfaction"]] = scaler.fit_transform(df[["Ad Influence", "Product Satisfaction"]])
print(df)
5. 피처 엔지니어링 (Feature Engineering)
그로스 마케팅에서는 기존 데이터를 가공하여 새로운 인사이트를 얻을 수 있는 변수를 추가하는 것이 중요하다.
예를 들어, 만족도 점수를 기반으로 고객을 그룹화할 수 있다.
쉽게 말해서 기존 컬럼을 조합해서 합치는것 ( 예 : 식대, 의류, 교통 컬럼 → 생활비 컬럼)
# 제품 만족도 점수가 4 이상이면 "High", 그렇지 않으면 "Low"
df["Satisfaction Level"] = df["Product Satisfaction"].apply(lambda x: "High" if x >= 0.8 else "Low")
print(df)
기타 기억할 것
데이터 프레임을 딕셔너리 형태로 간단히 바꿔주는 함수
to_dict() 함수를 사용
orient 옵션으로 변환형식 선택 가능
데이터 분석시 사용하면 좋음 → orient="list" (각 컬럼을 Key로 하고, 값들을 리스트로 묶음.)
컬럼에는 반드시 언더바(_)쓴다. 파이썬은 괜찮지만 mariaDB에서 에러남.