天天看點

Python——資料分析,原來女孩子喜歡這些禮物

每次情人節我都會問女朋友,你喜歡啥?你想要啥?但是每次女朋友每次都說:‘’你自己想,伸手要來的沒有驚喜”。這搞的我還沒到情人節就開始失眠了,總是擔心送的禮物她會不喜歡,相信有很多朋友跟我一樣苦惱吧。今天特意爬取了某東的資料,來分析下大家情人節都送什麼給女朋友。(資料在這裡噢,點一下領取…)

Python——資料分析,原來女孩子喜歡這些禮物

主要使用Excel和Python的Pandas 庫、Streamlit 庫、Plotly 庫進行搭建可視化大屏。

Python——資料分析,原來女孩子喜歡這些禮物

一、前提準備

本案例資料相對結構化,僅用 Excel 結合 Pandas 做簡單處理即可,Plotly 制作可視化圖表,Streamlit 搭建可視化頁面。

Python——資料分析,原來女孩子喜歡這些禮物

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
           
Python——資料分析,原來女孩子喜歡這些禮物

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

Python——資料分析,原來女孩子喜歡這些禮物

官方文檔位址:https://docs.streamlit.io/

Streamlit 是一個功能強大,完全免費的開源應用程式架構,它能幫你不用懂得複雜的 HTML,CSS 等前端技術就能快速做出來一個炫酷的 Web 頁面。Streamlit 是一個用于機器學習、資料可視化的 Python 架構,用極短的時間快速生成一個基于 Web 的 GUI。當然,你也可以将其用于給自己的 Python 腳本建立前端展示頁面,也是一個不錯的選擇。

二、準備資料

Python——資料分析,原來女孩子喜歡這些禮物

關鍵字搜尋【情人節禮物 女友 2022】,用第三方采集軟體爬取資料 2500+ 條,準備資料如下:

Python——資料分析,原來女孩子喜歡這些禮物

三、分析目的

通過禮品類别、品牌、和價格區間進行篩選關聯

Python——資料分析,原來女孩子喜歡這些禮物

① 禮品類别(大類)銷量對比情況

② 禮品價格區間占比情況

③ 各禮品小類的銷量對比(和大類進行關聯)

④ 禮品類别的價格分布

⑤ 品牌禮品的 Top 10 推薦

Python——資料分析,原來女孩子喜歡這些禮物

四、代碼思路

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 讀取資料

Python——資料分析,原來女孩子喜歡這些禮物
# 讀取資料
@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"
)
           
Python——資料分析,原來女孩子喜歡這些禮物
# 首頁面标題
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))
)
           
Python——資料分析,原來女孩子喜歡這些禮物

從禮品類别來看,送美妝護膚類的穩居第一,看來情人節口紅必不可少呀;排名第二的是箱包皮具類,看來送包包也是也非常不錯的選擇呢。

Python——資料分析,原來女孩子喜歡這些禮物
# 圓環圖:禮物價格區間占比
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("""---""")
           
Python——資料分析,原來女孩子喜歡這些禮物

禮品價格想必是大家最關心的了吧,從占比來看近 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)),
)
           
Python——資料分析,原來女孩子喜歡這些禮物

上面結果是按照所有類别進行分析的,當然你也可以按照自己喜歡的類别,檢視品牌銷量前 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)),
)
           
Python——資料分析,原來女孩子喜歡這些禮物

這裡選擇【美妝護膚】這個類别,分析各小類的銷量對比,原來第一的是眼霜和爽膚水,第二的是口紅。想必這是小姐姐的最愛吧。

# 箱線圖:各類别禮品的價格分布
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)),
)
           
Python——資料分析,原來女孩子喜歡這些禮物

價格區間篩選了 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
           

最後運作上面指令,這樣一個關于情人節的資料可視化看闆,就搭建完成啦!這下情人節再也不用擔心送的禮物女朋友不喜歡了,果然男孩子跟女孩子想的都是不一樣的。有了這份資料再也不用擔心女朋友生氣了。

Python——資料分析,原來女孩子喜歡這些禮物