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