데이터 분석 part

Pandas 기초

bleufonce 2025. 2. 9. 21:27

Pandas 란?

  • Python에서 데이터 분석과 조작을 쉽게 할 수 있도록 하는 오픈소스 라이브러리
  • 엑셀과 유사한 데이터 구조 제공. 표 형태의 데이터를 효율적으로 다룰 수 있음.
  • Numpy 기반(C언어로 작성한 라이브러리)이라 고속 연산 가능.
  • 데이터 정리, 변환, 분석, 시각화 등의 기능 제공.
  • CSV(DB의 공통 표준), Excel, JSON, SQL, 등 다양한 형식의 데이터 처리 가능.
  • 누락된 데이터인 결측값(NaN) 처리 기능 제공. (NaN = Not a Number)
  • 다른 라이브러리와 호환성 매우 좋음.

 

Pandas 불러오기

import pandas as pd  # 일반적으로 'pd'라는 별칭으로 사용

 

 

Pandas의 데이터 구조

Series : 1차원 데이터 구조 (엑셀의 한 열과 유사)

  • 리스트와 유사하지만 인덱스가 추가되어 데이터에 쉽게 접근
import pandas as pd

# Series 생성
click_rates = pd.Series([0.05, 0.10, 0.15, 0.20], index=["A", "B", "C", "D"])

print(click_rates)

 

출력 결과
A    0.05
B    0.10
C    0.15
D    0.20
dtype: float64     → 64bit 컴퓨터에서 기본

* Click rates 는 인스턴스, 객체 / pd는 클래스

 

 

Dataframe : 2차원 데이터 구조 (엑셀의 표와 유사)

  • 행과 열을 가진다.
# DataFrame 생성
data = {
    "Campaign": ["봄맞이 이벤트", "여름 할인", "가을 특별전"],
    "CTR": [0.12, 0.15, 0.08],
    "CR": [0.05, 0.07, 0.03]
}

df = pd.DataFrame(data)

print(df)
출력결과

     Campaign     CTR     CR
0 봄맞이 이벤트 0.12   0.05
1 여름 할인        0.15    0.07
2 가을 특별전    0.08    0.03

* 딕셔너리 형태로 출력 {키값(컬럼) : 밸류값(데이터)}
* df 는 인스턴스, 객체 / pd는 클래스

 

 

Pandas의 주요 기능

 

데이터 읽기

df = pd.read_csv(데이터 파일이름)
파일 확장자명 까지 붙이기
df는 객체, 인스턴스
'utf-8-sig' 인코딩은 CSV 파일을 다룰 때 한글 깨짐을 방지하는 용도

 

Excel 파일 저장

df.to_excel("원하는파일명.xlsx", index=False)  # 엑셀 파일로 저장

 

데이터프레임 정보출력 -  df.info()

 

상위 5개 데이터 확인 - df.head()

 

조건에 맞는 데이터 조회 - df[df["컬럼명"] 조건]

 

조건이 2개 이상인 데이터 조회 - df[(df["컬럼명"] 조건) & (df["컬럼명"] 조건)]

 

해당컬럼 기준 상위 10개 데이터  - df.nlargest(10, "컬럼명")

 

새로운 컬럼 추가(계산해서) - ex. df[새컬럼] = df[컬럼명] / df["컬럼명)"]

 

데이터 프레임을 표 형태로 출력 - display(df)

 

* 특정 행 조회 ☆

df.loc[ ] → 라벨 기반 인덱스로 조회

df.iloc[ ] → 정수 인덱스(0부터 시작)로 조회

 

* 특정 열 조회 ☆

df["컬럼명"]  → 한가지의 열

df[["컬럼명", 컬럼"]]  → 여러 열 조회

 

* 특정 행과 특정 열 조회 ☆

df.loc[행번호, "열이름"] → 특정 행과 특정 열 값 조회

df.iloc[행번호, 열번호] → 정수 인덱스로 특정 행, 특정 열 값 조회

 

 

데이터 필터링 예시

import pandas as pd

# 데이터 로드
file_path = "/content/marketing_data.csv"
df = pd.read_csv(file_path, encoding="utf-8-sig")

# 필터링 조건 설정 >>> 데이터 셋을 구성할 때 자주 씀!
filtered_df = df[
    (df["광고비(만원)"] >= 300) &  # 광고비가 300만원 이상
    (df["구매전환율(%)"] >= 5) &  # 구매전환율이 5% 이상
    (df["매출액(만원)"] >= 5000) &  # 매출액이 5000만원 이상
    (df["SNS공유수"] >= 100) &  # SNS 공유수가 100 이상
    (df["방문자수"] >= 3000)  # 방문자수가 3000명 이상
]

# 결과 출력
print(filtered_df)
데이터 셋을 만들 때 필터링 조건을 자주 설정한다.

 

데이터 그룹화  - df. groupby()

df.groupby("그룹기준열").집계함수()
예시 
df.groupby("카테고리")["매출액(만원)"].sum() 
이 코드는 "카테고리"열을 기준으로 그룹화하여 "매출액(만원)의 합계를 계산한다.

 

기능 코드
그룹별 합계 df.groupby("카테고리")["매출액(만원)"].sum()
그룹별 평균 df.groupby("카테고리")["매출액(만원)"].mean()
그룹별 개수 df.groupby("카테고리")["매출액(만원)"].count()
여러개 그룹 기준 df.groupby(["카테고리", "지역"])["매출액(만원)"].mean()
여러개 집계 연산 기준 df.groupby("카테고리").agg({"매출액(만원)": "sum", "광고비(만원)": "mean"})

 

 

 

데이터 기본 탐색

  • 데이터 크기 확인 → .shape
  • 컬럼명 확인 → .columns
  • 데이터 정보 출력 → .info()
  • 데이터 타입 확인 → .dtypes
  • 데이터 샘플 확인 → .head(), .tail()
  • 기초 통계 분석 → .describe()
  • 고유값 확인 → .unique(), .value_counts()    →  df["방문자수"].unique() # "카테고리" 열의 고유값 조회
  • 결측값 확인 → .isnull().sum()

 

 

Growth marketing 성공 분석 예시

import pandas as pd

# 데이터 로드
file_path = "/content/manufacturing_growth_marketing.csv"
df = pd.read_csv(file_path, encoding="utf-8-sig")

# 날짜 데이터를 datetime 형식으로 변환
df["날짜"] = pd.to_datetime(df["날짜"])

# 1. 광고비 대비 매출 성과 (ROAS: Return on Ad Spend)
df["ROAS"] = df["매출액(만원)"] / df["광고비(만원)"]  # ROAS = 매출액 / 광고비
average_roas = df["ROAS"].mean()

# 2. 구매 전환율의 평균
average_conversion_rate = df["구매전환율(%)"].mean()

# 3. B2B 문의 수 증가율 분석
df["B2B 문의 변화율(%)"] = df["B2B 문의 수"].pct_change() * 100
average_b2b_growth = df["B2B 문의 변화율(%)"].mean()

# 4. 방문자 1인당 매출액
df["1인당 매출액(만원)"] = df["매출액(만원)"] / df["방문자수"]
average_revenue_per_visitor = df["1인당 매출액(만원)"].mean()

# 5. SNS 공유 증가율과 매출 변화율 간의 상관관계
df["SNS 공유 변화율(%)"] = df["SNS 공유수"].pct_change() * 100
df["매출 변화율(%)"] = df["매출액(만원)"].pct_change() * 100
sns_correlation = df["SNS 공유 변화율(%)"].corr(df["매출 변화율(%)"])

# 6. 이메일 구독자 증가율
df["이메일 구독자 증가율(%)"] = df["이메일 구독자수"].pct_change() * 100
average_email_growth = df["이메일 구독자 증가율(%)"].mean()

# 7. B2C 판매량 증가율
df["B2C 판매 변화율(%)"] = df["B2C 판매 수량"].pct_change() * 100
average_b2c_growth = df["B2C 판매 변화율(%)"].mean()

# 8. 평균 주문 단가 증가율
df["평균 주문 단가 변화율(%)"] = df["평균 주문 단가(만원)"].pct_change() * 100
average_order_price_growth = df["평균 주문 단가 변화율(%)"].mean()

# 성공 여부 판단 기준
success_criteria = {
    "ROAS": average_roas >= 4,  # ROAS 4 이상이면 성공
    "구매전환율": average_conversion_rate >= 5,  # 구매전환율 5% 이상이면 성공
    "B2B 성장률": average_b2b_growth >= 2,  # B2B 문의 증가율 2% 이상이면 성공
    "방문자당 매출": average_revenue_per_visitor >= 5,  # 방문자당 매출 5만원 이상이면 성공
    "SNS-매출 상관관계": sns_correlation >= 0.3,  # SNS 공유와 매출의 상관관계가 0.3 이상이면 성공
    "이메일 구독 증가": average_email_growth >= 2,  # 이메일 구독 증가율 2% 이상이면 성공
    "B2C 판매 증가": average_b2c_growth >= 3,  # B2C 판매 증가율 3% 이상이면 성공
    "평균 주문 단가 증가": average_order_price_growth >= 1,  # 평균 주문 단가 증가율 1% 이상이면 성공
}

# 전체 성공 여부 판단, all()함수는 하나라도 false면 실패가 됨
overall_success = all(success_criteria.values())

# 결과 출력
print("성공 여부 기준 충족 여부:")
for key, value in success_criteria.items():
    print(f"{key}: {'✅ 성공' if value else '❌ 실패'}")

print("\n최종 성공 여부:", "✅ 성공" if overall_success else "❌ 실패")

 

 

 

기억하기

bins는 범위를 나타낸다.
조건에 맞는 데이터를 조회하는 기능들을 자주 눈에 익혀두기
컬럼설계를 잘 할 줄 알아야 한다.
데이터들과 실제 사회현상을 연결시킬 줄 알아야 한다.