數據分析學習總結之實例練習(雙十一淘寶美妝)

本次通過對雙十一淘寶美妝數據的分析實踐,我系統掌握了數據處理與分析的完整流程,從數據初步認知到深度挖掘,再到可視化呈現與結論提煉,收獲頗豐。以下是具體的學習總結:

一、數據初步了解:奠定分析基礎

在分析初期,我們首先對數據進行了全面 “掃描”。通過df.head()查看前五行數據,直觀了解了每條數據包含的 7 個特征:update_time(更新時間)、id(商品 ID)、title(商品標題)、price(價格)、sale_count(銷量)、comment_count(評論數)、店名(店鋪名稱)。

借助df.info()df.shape,明確了數據規模為 27598 條記錄,且發現sale_countcomment_count存在缺失值,其他特征無缺失,這為后續的數據清洗指明了方向。而df.describe()則提供了數值型特征的統計量,如價格均值為 362.83 元,銷量均值為 12301.77 件等,讓我們對數據的分布有了初步判斷。

二、數據清洗:保障數據質量

數據清洗是分析的關鍵環節,直接影響后續結果的準確性,主要完成了以下工作:

  • 重復值處理:使用drop_duplicates刪除了 86 條重復數據,得到 27512 條有效數據,并通過reset_index重置行索引,確保數據結構規范。
  • 缺失值處理:觀察發現sale_countcomment_count的缺失值可能代表銷量或評論數為 0,因此采用fillna(0)用 0 填補缺失值,經檢查后確認無空值殘留。
  • 新特征挖掘:這是本次分析的亮點之一。首先用jieba對商品標題進行分詞,生成subtitle列,為后續分類做準備;然后基于自定義的分類字典,將商品劃分為 “護膚品”“化妝品” 等主類別和 “乳液類”“口紅類” 等子類別,新增main_typesub_type列;此外,根據標題是否含 “男士”“男生” 等關鍵詞,新增是否男士專用列;最后,通過price * sale_count計算出銷售額列,豐富了分析維度。

三、數據分析及可視化:洞察數據規律

借助matplotlibseaborn工具,我們對數據進行了多維度分析與可視化呈現,得出了諸多有價值的結論:

1. 品牌維度分析

  • 商品數量:悅詩風吟的商品數量遙遙領先,但銷量和銷售額并非頂尖,說明商品數量多并不一定等同于市場表現好。
  • 銷量與銷售額:相宜本草在銷量和銷售額上均位居第一,且銷量約為第二名的兩倍,但銷售額遠不到兩倍,反映出其商品均價較低的特點。
  • 平均單價:將品牌按平均單價分為 A(0-100 元)、B(100-200 元)、C(200-300 元)、D(300 元以上)四類,發現 A 類品牌銷售額占比最高,D 類最低,且定價越低的品牌平均銷售額越高,印證了 “價格親民的品牌更易獲得高銷售額” 的推測。

2. 類別維度分析

  • 大類表現:護膚品的銷量和銷售額占比遠高于化妝品及其他類別,是美妝市場的主力。
  • 小類表現:清潔類和補水類護膚品銷量領先,且各類別的銷量與銷售額占比基本正相關,符合市場常識。
  • 品牌與類別結合:相宜本草在面霜、乳液、補水等多個小類中銷量最高,美寶蓮在口紅、眼部彩妝類表現突出,妮維雅則在清潔類中占據絕對優勢。

3. 性別維度分析

  • 男士專用商品占比:男士專用商品的銷量和銷售額占比均較低,說明美妝市場仍以女性消費者為主。
  • 男士商品類別偏好:男士專用商品中,清潔類和補水類銷量占比較高,反映出男性在美妝消費上更注重基礎清潔和保濕需求。

四 、代碼及圖片

import numpy as np
import pandas as pd
import jieba
import matplotlib.pyplot as plt
import seaborn as sns


# 設置中文顯示
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 1. 數據讀取與初步了解
df = pd.read_csv('雙十一淘寶美妝數據.csv')
print("數據前五行:")
print(df.head())
print("\n數據特征信息:")
print(df.info())
print("\n數據形狀:", df.shape)
print("\n數值型特征統計量:")
print(df.describe())

# 2. 數據清洗
# 2.1 重復值處理
data = df.drop_duplicates(inplace=False)
data.reset_index(inplace=True, drop=True)
print("\n去重后數據形狀:", data.shape)

# 2.2 缺失值處理
print("\n缺失值填補前情況:")
print(data.loc[data['sale_count'].isnull()].head())
print(data.loc[data['comment_count'].isnull()].tail())
data = data.fillna(0)
print("\n缺失值填補后是否還有空值:")
print(data.isnull().any())

# 2.3 數據挖掘與新特征生成
# 對標題進行分詞
subtitle = []
for each in data['title']:
k = jieba.lcut_for_search(each) # 搜索引擎模式分詞
subtitle.append(k)
data['subtitle'] = subtitle
print("\n標題分詞結果示例:")
print(data[['title', 'subtitle']].head())

# 商品分類(主類別與子類別)
basic_data = """護膚品 乳液類 乳液 美白乳 潤膚乳 凝乳 柔膚液 亮膚乳 菁華乳 修護乳
護膚品 眼部護理類 眼霜 眼部 眼膜
護膚品 面膜類 面膜
護膚品 清潔類 洗面 潔面 清潔 卸妝 潔顏 洗顏 去角質 磨砂
護膚品 化妝水 化妝水 爽膚水 柔膚水 補水露 凝露 柔膚液 精粹水 亮膚水 潤膚水 保濕水 菁華水 保濕噴霧 舒緩噴霧
護膚品 面霜類 面霜 日霜 晚霜 柔膚霜 滋潤霜 保濕霜 凝霜 日間霜 晚間霜 乳霜 修護霜 亮膚霜 底霜 菁華霜
護膚品 精華類 精華液 精華水 精華露 精華素 精華
護膚品 防曬類 防曬
護膚品 補水類 補水
化妝品 口紅類 唇釉 口紅 唇彩 唇膏
化妝品 底妝類 散粉 蜜粉 粉底液 定妝粉 氣墊 粉餅 BB CC 遮瑕 粉霜 粉底膏 粉底霜
化妝品 眼部彩妝 眉粉 染眉膏 眼線 眼影 睫毛膏 眉筆
化妝品 修容類 鼻影 修容粉 高光 腮紅"""

# 構建分類字典
dcatg = {}
catg = basic_data.split('\n')
for i in catg:
parts = i.strip().split('\t')
if len(parts) >= 3:
main_cat = parts[0]
sub_cat = parts[1]
keywords = parts[2:]
for j in keywords:
if j: # 跳過空字符串
dcatg[j] = (main_cat, sub_cat)

# 生成主類別和子類別特征
sub_type = []
main_type = []
for i in range(len(data)):
exist = False
for j in data['subtitle'][i]:
if j in dcatg:
sub_type.append(dcatg[j][1])
main_type.append(dcatg[j][0])
exist = True
break
if not exist:
sub_type.append('其他')
main_type.append('其他')
data['sub_type'] = sub_type
data['main_type'] = main_type
print("\n分類為'其他'的商品數量:", data.loc[data['sub_type'] == '其他'].shape[0])

# 生成"是否男士專用"特征
sex = []
for i in range(len(data)):
subtitle = data['subtitle'][i]
if '男士' in subtitle or '男生' in subtitle:
sex.append('是')
elif '男' in subtitle and '女' not in subtitle and '斬男' not in subtitle:
sex.append('是')
else:
sex.append('否')
data['是否男士專用'] = sex
print("\n男士專用商品數量統計:")
print(data['是否男士專用'].value_counts())

# 生成"銷售額"特征
data['銷售額'] = data['price'] * data['sale_count']
print("\n添加銷售額后的數據示例:")
print(data.head())

# 3. 數據分析及可視化
# 3.1 各店鋪基本情況分析
plt.figure(figsize=(12, 10))

# 各店鋪商品數量
plt.subplot(2, 2, 1)
plt.tick_params(labelsize=15)
data['店名'].value_counts().sort_values().plot.bar()
plt.title('各品牌商品數', fontsize=20)
plt.ylabel('商品數量', fontsize=15)
plt.xlabel('店名')

# 各店鋪總銷量
plt.subplot(2, 2, 2)
plt.tick_params(labelsize=15)
data.groupby('店名')['sale_count'].sum().sort_values().plot.bar()
plt.title('各品牌所有商品的銷量', fontsize=20)
plt.ylabel('商品總銷量', fontsize=15)

# 各店鋪總銷售額
plt.subplot(2, 2, 3)
plt.tick_params(labelsize=15)
data.groupby('店名')['銷售額'].sum().sort_values().plot.bar()
plt.title('各品牌總銷售額', fontsize=20)
plt.ylabel('商品總銷售額', fontsize=15)

# 各品牌平均每單單價
plt.subplot(2, 2, 4)
plt.tick_params(labelsize=15)
avg_price = data.groupby('店名')['銷售額'].sum() / data.groupby('店名')['sale_count'].sum().replace(0, np.nan)
avg_price.sort_values().plot.bar()
plt.title('各品牌平均每單單價', fontsize=20)
plt.ylabel('售出商品的平均單價', fontsize=15)

plt.tight_layout()
plt.show(block=True)

# 3.2 不同價格區間品牌的銷售情況
A = avg_price[(avg_price <= 100) & (avg_price > 0)].index
B = avg_price[(avg_price <= 200) & (avg_price > 100)].index
C = avg_price[(avg_price <= 300) & (avg_price > 200)].index
D = avg_price[avg_price > 300].index

sum_sale = data.groupby('店名')['銷售額'].sum()

plt.figure(figsize=(16, 8))

# 各類別品牌銷售額占比
plt.subplot(1, 2, 1)
sum_sale_byprice = pd.concat([sum_sale[A].sort_values(),
sum_sale[B].sort_values(),
sum_sale[C].sort_values(),
sum_sale[D].sort_values()])
colors = ['grey'] * len(A) + ['g'] * len(B) + ['y'] * len(C) + ['m'] * len(D)
plt.pie(x=sum_sale_byprice, labels=sum_sale_byprice.index, colors=colors,
autopct='%0f%%', pctdistance=0.9)
plt.title('不同均價區間品牌的銷售額占比')

# 各類別平均每個店銷售額
plt.subplot(1, 2, 2)
plt.tick_params(labelsize=15)
plt.bar('均價0-100元', np.mean(sum_sale[A]) if not A.empty else 0, color='grey')
plt.bar('均價100-200元', np.mean(sum_sale[B]) if not B.empty else 0, color='g')
plt.bar('均價200-300元', np.mean(sum_sale[C]) if not C.empty else 0, color='y')
plt.bar('均價300元以上', np.mean(sum_sale[D]) if not D.empty else 0, color='m')
plt.title('不同類別的平均每個店銷售額', fontsize=20)
plt.ylabel('平均銷售額', fontsize=20)

plt.tight_layout()
plt.show(block=True)

# 3.3 各類別銷售情況分析
plt.figure(figsize=(12, 12))

# 大類銷售量占比
plt.subplot(2, 2, 1)
data.groupby('main_type')['sale_count'].sum().plot.pie(autopct='%0f%%', title='各大類銷售量占比')

# 大類銷售額占比
plt.subplot(2, 2, 2)
data.groupby('main_type')['銷售額'].sum().plot.pie(autopct='%0f%%', title='各大類銷售額占比')

# 小類銷售量占比
plt.subplot(2, 2, 3)
data.groupby('sub_type')['sale_count'].sum().plot.pie(autopct='%0f%%', title='各小類銷售量占比')

# 小類銷售額占比
plt.subplot(2, 2, 4)
data.groupby('sub_type')['銷售額'].sum().plot.pie(autopct='%0f%%', title='各小類銷售額占比')

plt.tight_layout()
plt.show(block=True)

# 3.4 各店鋪不同類別銷售情況(去除銷量為0的店鋪)
data1 = data.drop(index=data[data['店名'].isin(
data.groupby('店名')['sale_count'].sum()[data.groupby('店名')['sale_count'].sum() == 0].index
)].index)

# 各店鋪中各大類的銷量與銷售額
plt.figure(figsize=(16, 12))

plt.subplot(2, 1, 1)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='sale_count', hue='main_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店鋪中各大類的銷售量', fontsize=20)
plt.ylabel('銷量', fontsize=15)

plt.subplot(2, 1, 2)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='銷售額', hue='main_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店鋪中各大類的銷售額', fontsize=20)


plt.tight_layout()
plt.show(block=True)

# 各店鋪中各小類的銷量與銷售額
plt.figure(figsize=(16, 12))

plt.subplot(2, 1, 1)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='sale_count', hue='sub_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店鋪中各小類的銷售量', fontsize=20)
plt.ylabel('銷量', fontsize=15)

plt.subplot(2, 1, 2)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='銷售額', hue='sub_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店鋪中各小類的銷售額', fontsize=20)
plt.ylabel('銷售額', fontsize=15)

plt.tight_layout()
plt.show(block=True)

# 各小類中各店鋪的銷量與銷售額
plt.figure(figsize=(16, 12))

plt.subplot(2, 1, 1)
plt.tick_params(labelsize=10)
sns.barplot(x='sub_type', y='sale_count', hue='店名', estimator=np.sum, data=data1, ci=0)
plt.title('各小類中各店鋪的銷售量', fontsize=20)
plt.ylabel('銷量', fontsize=15)

plt.subplot(2, 1, 2)
plt.tick_params(labelsize=10)
sns.barplot(x='sub_type', y='銷售額', hue='店名', estimator=np.sum, data=data1, ci=0)
plt.title('各小類中各店鋪的銷售額', fontsize=20)
plt.ylabel('銷售額', fontsize=15)

plt.tight_layout()
plt.show(block=True)

# 3.5 性別因素對銷售的影響
plt.figure(figsize=(16, 16))

# 男士專用各小類銷售量占比
plt.subplot(2, 2, 1)
data.loc[data['是否男士專用'] == '是'].groupby('sub_type')['sale_count'].sum().plot.pie(
autopct='%0f%%', title='男士各小類銷售量占比', pctdistance=0.8)

# 非男士專用各小類銷售量占比
plt.subplot(2, 2, 2)
data.loc[data['是否男士專用'] == '否'].groupby('sub_type')['sale_count'].sum().plot.pie(
autopct='%0f%%', title='非男士專用各小類銷售量占比', pctdistance=0.8)

# 男士專用銷售量占總銷售量比例
plt.subplot(2, 2, 3)
data.groupby('是否男士專用')['sale_count'].sum().plot.pie(
autopct='%0f%%', title='男士專用銷售量占比', pctdistance=0.8)

# 男士專用銷售額占總銷售額比例
plt.subplot(2, 2, 4)
data.groupby('是否男士專用')['銷售額'].sum().plot.pie(
autopct='%0f%%', title='男士專用銷售額占比', pctdistance=0.8)

plt.tight_layout()
plt.show(block=True)

五、學習收獲與反思

通過本次實踐,我不僅熟練掌握了pandas的數據處理方法(如去重、填補缺失值、新增特征等)和matplotlibseaborn的可視化技巧,更重要的是學會了從數據中挖掘有價值的信息,形成分析思路。

同時也認識到,數據分析需要結合業務場景進行合理推測,例如對缺失值的處理邏輯、商品類別的劃分標準等,都需要基于對美妝行業的基本認知。此外,可視化圖表的選擇應服務于分析目的,清晰、直觀地呈現結論是關鍵。

未來,在數據分析中可進一步引入更多維度(如時間對銷量的影響、評論情感分析等),使分析更加全面深入。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918479.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918479.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何評估一個需求的業務價值

要科學、全面地評估一個需求的業務價值&#xff0c;核心在于建立一個多維度的、從戰略到財務、從客戶到風險的“價值羅盤”&#xff0c;并運用這套羅盤&#xff0c;對需求進行系統性的、數據驅動的量化與定性分析。一套成熟的價值評估體系&#xff0c;其構建必須涵蓋五大關鍵視…

day38_2025-08-12

一、 圖像數據的介紹 1.1 灰度圖像 從這里開始我們進入到了圖像數據相關的部分&#xff0c;也是默認你有之前復試班計算機視覺相關的知識&#xff0c;但是一些基礎的概念我仍然會提。 昨天我們介紹了minist這個經典的手寫數據集&#xff0c;作為圖像數據&#xff0c;相較于結構…

Kubernetes1.28-單Master集群部署

一、 服務器環境及初始化 1、架構分析 集群角色主機名操作系統IP地址masterk8s-masterOpenEuler24.03192.168.166.128nodek8s-node1OpenEuler24.03192.168.166.129nodek8s-node2OpenEuler24.03192.168.166.130 2、初始化 所有節點都需要初始化&#xff01; 2.1、清空Iptal…

使用pyqt5實現可勾選的測試用例界面

目錄 界面 代碼 python有哪些自動化測試的庫和html的報告的庫可以和這個軟件結合使用的 **一、自動化測試核心庫** **二、HTML報告生成庫** **三、其他實用工具** **與您的工具結合建議** 參考 界面 代碼 import sys import time import random from PyQt5.QtWidgets import (…

C語言變量的聲明和定義有什么區別?

定義&#xff1a;定義&#xff1a;為變量分配地址和存儲空間聲明&#xff1a;不分配地址和存儲空間一個變量可以在多個地方聲明&#xff0c;但是只在一個地方定義。加入extern修飾的是變量的聲明&#xff0c;說明此變量將在文件或在文件后面部分定義。1.變量聲明作用&#xff1…

imx6ull-驅動開發篇20——linux互斥體實驗

目錄 實驗程序編寫 修改設備樹文件 LED 驅動修改 mutex.c 測試mutexApp.c Makefile 文件 運行測試 在之前的文章里&#xff0c;我們學習了&#xff1a;驅動開發篇16——信號量與互斥體。 本講實驗里&#xff0c;我們來使用互斥體mutex實現 LED 燈互斥訪問的功能&#x…

[4.2-2] NCCL新版本的register如何實現的?

文章目錄1->2->31. ncclRegisterP2pIpcBuffer2. ncclIpcLocalRegisterBuffer(..., 1, 0,...)3. ipcRegisterBuffer(..., regRecord,..., isLegacyIpc)4. p2pProxyRegister()1->2->3 1. ncclRegisterP2pIpcBuffer 在enqueue.cc內的調用是&#xff1a; NCCLCHECK(…

在idea中git切換分支,但是我的文件沒add,沒commit

這是一個很悲傷的故事&#xff0c;我朋友一個下午寫了4個小時的代碼&#xff0c;差不多10多個類&#xff0c;都在切換分支的時候。IDEA發現有沖突&#xff0c;然后就要resolve conflict&#xff0c;發現自己不知道怎么操作&#xff0c;就點了abort & rollback。然后所有代碼…

GPFS api

一、核心命令行 API&#xff08;mm 命令集&#xff09; GPFS 最基礎且常用的接口是命令行工具集&#xff08;以mm為前綴&#xff09;&#xff0c;用于文件系統的創建、配置、管理和監控。這些命令可直接在終端執行&#xff0c;也可通過腳本&#xff08;如 Shell、Python&#…

虛擬機一站式部署Claude Code 可視化UI界面

前言 最近&#xff0c;強大的 AI 編碼助手 Claude Code 在開發者社區中迅速走紅&#xff0c;憑借其出色的代碼生成和理解能力贏得了廣泛贊譽。然而&#xff0c;其純粹基于命令行的交互方式&#xff0c;對于許多習慣了圖形化界面的開發者&#xff0c;尤其是新手而言&#xff0c…

網站IP被劫持?三步自建防護盾

一、劫持檢測實戰&#xff08;Python腳本&#xff09; import requests import socket import ssldef check_hijacking(domain):try:# 獲取真實DNS解析real_ip socket.gethostbyname(domain)# 本地發起請求驗證response requests.get(f"https://{domain}", timeout…

SQL Server從入門到項目實踐(超值版)讀書筆記 23

第三篇 核心應用篇在本章中&#xff0c;將通過案例示范學習SQL Server數據庫的一些核心應用。例如&#xff0c;SQL Server視圖的使用、游標的應用、存儲過程的應用、索引的應用、觸發器的應用、SQL Server事務與鎖的應用等。學完本篇&#xff0c;讀者將對SQL Server數據庫的管理…

功能測試中常見的面試題-一

一、基礎概念與理論題什么是軟件測試&#xff1f;它的目的是什么&#xff1f;回答&#xff1a; 軟件測試是通過人工或自動化手段&#xff0c;運行或評估軟件系統&#xff0c;以驗證它是否滿足規定的需求、識別實際結果與預期結果之間的差異&#xff0c;并評估軟件產品質量的過程…

LINUX88 變量:命令定義;普通數組定義(復);declare -i /-x

問題 [codesamba ~]$ array3(ls axel-2.4) [codesamba ~]$ echo $array3 API [codesamba ~]$ ls axel-2.4 API CHANGES conn.o gui README tcp.o axel conf.c COPYING http.c ru.mo text.c axel.1 …

數字IC后端PPA優化| Timing一致性調整方法和Module Region規劃方法

Q1:直播課經常講到一致性&#xff0c;這個一致性的話一般是指place&#xff0c;CTS和PT的derating time&#xff0c;uncertainty和transition嗎&#xff0c;我大概知道innovus的uncertainty設置要比PT里面高一點&#xff0c;但具體設計時這幾部分的大小應該是一個什么樣的關系或…

電子電氣架構 --- 軟件定義汽車的驅動和挑戰

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

機器學習——10 支持向量機SVM

1 支持向量機 1.1 故事引入看下圖左邊&#xff0c;藍色和紅色的點混在一起&#xff0c;這就像一堆數據&#xff0c;沒辦法用一條簡單的直線把它們分開。再看下圖右邊&#xff0c;有一條直線把藍色和紅色的點分開&#xff0c;這就是SVM在找的“決策邊界”&#xff0c;它能把不同…

若以微服務部署踩坑點

windows docker desktop 部署nacos mysql1、docker部署nacosdocker pull nacos/nacos-server:v2.4.3docker啟動命令 docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 --privilegedtrue --network bridge -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMm…

Lua基礎+Lua數據類型

Lua基礎 Lua介紹 特點&#xff1a;輕量、小巧。C語言開發。開源。 設計的目的&#xff1a;嵌入到應用程序當中&#xff0c;提供靈活的擴展和定制化的功能。 luanginx&#xff0c;luaredis。 環境安裝 windows上安裝lua&#xff1a; 檢查機器上是否有lua C:\Users\cpf>lua lu…

基于VuePress2開發文檔自部署及嵌入VUE項目

最近在搞前端開發幫助文檔&#xff0c;轉了一圈發現Vue提供了一個高性能的、Vue驅動的靜態網站生成框架-VuePress。VuePress 是一個以 Markdown 為中心的靜態網站生成器。你可以使用 Markdown 來書寫內容&#xff08;如文檔、博客等&#xff09;&#xff0c;然后 VuePress 會生…