每次情人節我都會問女朋友,你喜歡啥?你想要啥?但是每次女朋友每次都說:‘’你自己想,伸手要來的沒有驚喜”。這搞的我還沒到情人節就開始失眠了,總是擔心送的禮物她會不喜歡,相信有很多朋友跟我一樣苦惱吧。今天特意爬取了某東的資料,來分析下大家情人節都送什麼給女朋友。(資料在這裡噢,點一下領取…)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5ImM4YWYiNWNwkzYlRmM4kzY0QTY0MDOwAzMkVWMkF2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
主要使用Excel和Python的Pandas 庫、Streamlit 庫、Plotly 庫進行搭建可視化大屏。
一、前提準備
本案例資料相對結構化,僅用 Excel 結合 Pandas 做簡單處理即可,Plotly 制作可視化圖表,Streamlit 搭建可視化頁面。
1.1 安裝依賴庫
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas==1.1.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plotly==4.14.3
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple streamlit==0.86.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl==3.0.6
1.2 Plotly
官方文檔位址:https://plot.ly/python/plotly-express/
Plotly Express 是一個新的進階 Python 可視化庫,它為複雜的圖表提供了一個簡單的文法。Plotly 互動效果明顯優于 Python 的兩大傳統可視化庫 Matplotlib 和 Seaborn。相比 Power BI 和 Tableau 等 BI 工具,Plotly 無法勝任資料清洗、關系模型等功能,僅是一個可視化工具。但與 Python 其它庫,比如今天使用的 Streamlit 配合,可以創造出像網站、可視化大屏、機器學習工具等各種精彩的應用。
1.3 Streamlit
官方文檔位址:https://docs.streamlit.io/
Streamlit 是一個功能強大,完全免費的開源應用程式架構,它能幫你不用懂得複雜的 HTML,CSS 等前端技術就能快速做出來一個炫酷的 Web 頁面。Streamlit 是一個用于機器學習、資料可視化的 Python 架構,用極短的時間快速生成一個基于 Web 的 GUI。當然,你也可以将其用于給自己的 Python 腳本建立前端展示頁面,也是一個不錯的選擇。
二、準備資料
關鍵字搜尋【情人節禮物 女友 2022】,用第三方采集軟體爬取資料 2500+ 條,準備資料如下:
三、分析目的
通過禮品類别、品牌、和價格區間進行篩選關聯
① 禮品類别(大類)銷量對比情況
② 禮品價格區間占比情況
③ 各禮品小類的銷量對比(和大類進行關聯)
④ 禮品類别的價格分布
⑤ 品牌禮品的 Top 10 推薦
四、代碼思路
4.1 導入相關包
import pandas as pd
import plotly.express as px
import streamlit as st
import plotly.figure_factory as ff
import plotly as py
import plotly.graph_objs as go
# 設定網頁
st.set_page_config(page_title="資料大屏", page_icon=":bar_chart:", layout="wide")
st.balloons()
4.2 讀取資料
# 讀取資料
@st.cache
def get_data_from_excel():
df = pd.read_excel(
io="data.xlsx",
engine="openpyxl",
sheet_name="data"
)
return df
df = get_data_from_excel()
4.3 設計左側邊欄和标題
# 側邊欄
st.sidebar.header("請在這裡篩選:")
category = st.sidebar.multiselect(
"禮物類别:",
options=df["禮品類别"].unique(),
default=df["禮品類别"].unique()
)
brand = st.sidebar.multiselect(
"選擇品牌:",
options=df["品牌"].unique(),
default=df["品牌"].unique(),
)
price = st.sidebar.multiselect(
"價格區間:",
options=df["價格區間"].unique(),
default=df["價格區間"].unique()
)
df_selection = df.query(
"禮品類别 == @category & 品牌 == @brand & 價格區間 == @price"
)
# 首頁面标題
st.title(":bar_chart: 情人節看看大家都送什麼禮物")
st.markdown("##")
4.4 畫可視化圖
# 橫向條形圖:各類别禮品銷量
sales_by_product_line = (
df_selection.groupby(by=["禮品類别"]).sum()[["銷量"]]
)
fig_product_sales = px.bar(
sales_by_product_line,
x="銷量",
y=sales_by_product_line.index,
orientation="h",
title="<b>各類别禮品品銷量</b>"
)
fig_product_sales.update_layout(
plot_bgcolor="rgba(0,0,0,0)",
xaxis=(dict(showgrid=False))
)
從禮品類别來看,送美妝護膚類的穩居第一,看來情人節口紅必不可少呀;排名第二的是箱包皮具類,看來送包包也是也非常不錯的選擇呢。
# 圓環圖:禮物價格區間占比
las = df_selection.groupby(df_selection['價格區間']).size()
las.sort_values(ascending=True,inplace=True)
layout = go.Layout(
title = '<b>禮品價格區間占比</b>',
barmode='stack'
)
fig_price_sales = go.Figure(data=[go.Pie(labels=las.index, hole = 0.7,values=las.values,hoverinfo = "label + percent")],layout=layout)
fig_price_sales.update_layout(
xaxis=dict(tickmode="linear"),
plot_bgcolor="rgba(0,0,0,0)",
yaxis=(dict(showgrid=False)),
)
# 分隔符
st.markdown("""---""")
禮品價格想必是大家最關心的了吧,從占比來看近 50% 的禮品價格都在 100~500 元之間呐,100 元以下的 6%,價格區間占比最小;再看看 2000 元以上的禮品,占比 15%,這是真愛呀。
# TOP 10 銷量最高品牌
sales_by_brand = df_selection.groupby(by=["品牌"])
brand_dic = {i:j['銷量'].sum() for i,j in sales_by_brand}
brand_dic = sorted(brand_dic.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)
ins = []
val = []
for i, j in brand_dic[:10]:
ins.append(i.split()[0])
val.append(j)
sales_by_brand = px.bar(
x=ins,
y=val,
title="<b>TOP 10 銷量最高品牌</b>",
)
sales_by_brand.update_layout(
xaxis=dict(tickmode="linear"),
plot_bgcolor="rgba(0,0,0,0)",
yaxis=(dict(showgrid=False)),
)
上面結果是按照所有類别進行分析的,當然你也可以按照自己喜歡的類别,檢視品牌銷量前 10。
# 柱狀圖:各詳細類别禮品銷量對比
sales_by_goods = df_selection.groupby(by=["小類"]).sum()[["銷量"]]
sales_by_goods = px.bar(
sales_by_goods,
x=sales_by_goods.index,
y="銷量",
title="<b>詳細類别産品的銷量</b>",
)
sales_by_goods.update_layout(
xaxis=dict(tickmode="linear"),
plot_bgcolor="rgba(0,0,0,0)",
yaxis=(dict(showgrid=False)),
)
這裡選擇【美妝護膚】這個類别,分析各小類的銷量對比,原來第一的是眼霜和爽膚水,第二的是口紅。想必這是小姐姐的最愛吧。
# 箱線圖:各類别禮品的價格分布
fig = px.box(df_selection, x="禮品類别", y="價格",color="禮品類别",
title="<b>各類别禮品的價格分布</b>")
fig.update_layout(
xaxis=dict(tickmode="linear"),
plot_bgcolor="rgba(0,0,0,0)",
yaxis=(dict(showgrid=False)),
)
價格區間篩選了 1000 元以下的禮品,從結果來看,鐘表的價格最高,大部分都在 500 元以上,好像找到了鐘表銷量最低的原因呐;要說成本效益,還是創意禮品、包包、美妝護膚,中位數趨于 200~300 之間。
# 将圖形顯示到前端頁面
left_column, right_column,r = st.columns(3)
right_column.plotly_chart(fig_price_sales, use_container_width=True)
left_column.plotly_chart(fig_product_sales, use_container_width=True)
r.plotly_chart(sales_by_brand, use_container_width=True)
st.markdown("""---""")
left, right = st.columns(2)
left.plotly_chart(sales_by_goods, use_container_width=True)
right.plotly_chart(fig, use_container_width=True)
# 隐藏streamlit預設格式資訊
hide_st_style = """
<style>
#MainMenu {visibility: hidden;}
footer {visibility: hidden;}
header {visibility: hidden;}
</style>
"""
st.markdown(hide_st_style, unsafe_allow_html=True)
streamlit run demo.py
最後運作上面指令,這樣一個關于情人節的資料可視化看闆,就搭建完成啦!這下情人節再也不用擔心送的禮物女朋友不喜歡了,果然男孩子跟女孩子想的都是不一樣的。有了這份資料再也不用擔心女朋友生氣了。