영업이익은 영업 활동을 통해 순수하게 남은 이익을 의미합니다. 이는 다음과 같이 정의됩니다:
본 데이터에서는 각 점포 당 기타 비용이 모두 동일하다고 가정하여, 매출액 - 매출원가를 통해 영업이익을 계산했습니다. 실제 상황에서는 점포별 월세, 관리비, 인건비, 배송비 등이 기타 비용에 포함됩니다.
다음은 UDF를 활용하여 영업이익을 계산하는 코드입니다:
from pyspark.sql.functions import udf
from pyspark.sql import types as T
def calculate_gross_profit(unit_sales, unit_cost, sales_amt):
gross_profit = sales_amt * (unit_sales - unit_cost)
return gross_profit
calculate_gross_profit_udf = udf(
calculate_gross_profit, # UDF로 만든 함수
T.DoubleType() # 반환 타입
)
위에서 정의한 UDF를 데이터프레임에 적용하여 새로운 컬럼을 추가합니다:
df = (
df
.withColumn(
"gross_profit",
calculate_gross_profit_udf(
df.StateBottleRetail,
df.StateBottleCost,
df.BottlesSold
)
)
.select("StateBottleRetail", "StateBottleCost", "BottlesSold", "gross_profit")
)
df.show()
다음 코드는 연도별, 점포별로 데이터를 그룹화하여 총 영업이익과 평균 영업이익을 계산합니다:
pd1 = (
df
.withColumn("Year", F.year("Date").cast("long")) # 연도만 추출
.filter(F.col("Year") < 2023) # 2023년 데이터 제외
.withColumn(
"gross_profit",
calculate_gross_profit_udf(
df.StateBottleRetail,
df.StateBottleCost,
df.BottlesSold
)
)
.groupBy("Year", "City", "StoreNumber")
.agg(
F.sum("gross_profit").alias("gross_profit")
)
.groupBy("Year", "City")
.agg(
F.avg("gross_profit").alias("gross_profit_avg")
)
.orderBy("Year")
.toPandas()
)
pd1
지역별 영업이익의 평균과 총 매출 데이터를 시각화하여 상관관계를 분석합니다:
fig = px.scatter(
pd1,
x="SaleDollars_avg", y="gross_profit_avg", color="City", hover_data=['City']
)
fig.update_layout(title_text="지역별 평균 매출과 영업이익의 관계")
fig.show()
PySpark의 UDF를 활용하면 복잡한 사용자 정의 계산을 데이터프레임에 간단히 적용할 수 있습니다. 이를 통해 대규모 데이터에서도 효율적으로 영업이익을 분석할 수 있으며, 시각화 도구를 활용하여 결과를 명확히 전달할 수 있습니다.