本文會(huì)利用 SQL 語句和 Pandas 對(duì)前面抓取和整理的的胸罩?jǐn)?shù)據(jù)進(jìn)行分析娃殖,本文主要分析了胸罩銷售的比例值戳,以及 A、B炉爆、C堕虹、D 罩杯的銷售比例。
用 SQL 語句分析胸罩(按罩杯尺寸)的銷售比例
既然銷售數(shù)據(jù)都保存在 SQLite 數(shù)據(jù)庫(kù)中芬首,那么我們不妨先用 SQL 語句做一下統(tǒng)計(jì)分析赴捞,本節(jié)將對(duì)胸罩按罩杯的銷售量做一個(gè)銷售比例統(tǒng)計(jì)分析。由于抓取的數(shù)據(jù)沒有超過 D 罩杯的郁稍,所以做數(shù)據(jù)分析時(shí)就不考慮 D 以上罩杯的胸罩銷售數(shù)據(jù)了赦政,這里只考慮 A、B耀怜、C 和 D 罩杯胸罩的銷售數(shù)據(jù)恢着。
本節(jié)要統(tǒng)計(jì)的是某一個(gè)尺寸的胸罩銷售數(shù)量占整個(gè)銷售數(shù)量的百分比,這里需要統(tǒng)計(jì)和計(jì)算如下3類數(shù)據(jù)封寞。
某一個(gè)尺寸的胸罩銷售數(shù)量
胸罩銷售總數(shù)量
第1類數(shù)據(jù)和第2類數(shù)據(jù)的差值(百分比)
這3類數(shù)據(jù)完全可以用一條 SQL 語句搞定然评,為了同時(shí)搞定 A、B狈究、C 和 D 罩杯的銷售比例碗淌,可以用4條類似的 SQL 語句,中間用 union all 連接抖锥。
select 'A' as 罩杯,printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) as 比例 from t_sales where size1='A'
union all
select 'B',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) from t_sales where size1='B'
union all
select 'C',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) from t_sales where size1='C'
union all
select 'D',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) from t_sales where size1='D'
執(zhí)行上面的 SQL 語句亿眠,會(huì)看到如圖1所示的查詢結(jié)果。
圖1 查詢結(jié)果
不過圖1所示的分析結(jié)果有些問題磅废,就是沒有按銷量排序纳像,而且沒有顯示具體的銷量。如果要按銷量排序拯勉,而且加上具體的銷量竟趾,需要使用下面的 SQL 語句憔购。
select 'A' as 罩杯,printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) as 比例, count(*) as 銷量 from t_sales where size1='A'
union all
select 'B',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) , count(*) as c from t_sales where size1='B'
union all
select 'C',printf("%0.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) , count(*) as c from t_sales where size1='C'
union all
select 'D',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where size1 is not null))) , count(*) as c from t_sales where size1='D'
order by 銷量 desc
上面的 SQL 語句不僅加入了銷售比例,還加入了銷售數(shù)量岔帽,并且按銷量降序排列玫鸟。這些 SQL 語句需要考慮 size1 字段空值的情況,因?yàn)樽ト〉纳俨糠咒N售記錄并沒有罩杯尺寸數(shù)據(jù)犀勒。執(zhí)行上面的 SQL 語句后屎飘,會(huì)輸出如圖2所示的查詢結(jié)果。
從圖2的統(tǒng)計(jì)結(jié)果可以看出贾费,B 罩杯占總體的銷售比例最大钦购,其次是 A 罩杯,也就是說中國(guó)女性胸部尺寸主要集中在 A 和 B 罩杯褂萧。
用 Pandas 和 Matplotlib 分析對(duì)胸罩銷售比例進(jìn)行可視化分析
既然 Python 提供了這么好的 Pandas 和 Matplotlib押桃,那么就可以完全不使用 SQL 語句進(jìn)行數(shù)據(jù)分析了,可以 100% 使用 Python 代碼搞定一切导犹。
本節(jié)將使用 Pandas 完成與前面相同的數(shù)據(jù)分析怨规,并使用 Matplotlib 將分析結(jié)果以圖形化方式展現(xiàn)出來。
Pandas 在前面的文章已經(jīng)講過了锡足,這里不再深入介紹。本次分析主要使用了 groupby 方法按罩杯(size1)分組壳坪,然后使用 count 方法統(tǒng)計(jì)組內(nèi)數(shù)量舶得,最后使用 insert 方法添加了一個(gè)“比例”字段。
from pandas import *
from matplotlib.pyplot import *
import sqlite3
import sqlalchemy
# 打開bra.sqlite數(shù)據(jù)庫(kù)
engine = sqlalchemy.create_engine('sqlite:///bra.sqlite')
rcParams['font.sans-serif'] = ['SimHei']
# 查詢t_sales表中所有的數(shù)據(jù)
sales = read_sql('select source,size1 from t_sales',engine)
# 對(duì)size1進(jìn)行分組爽蝴,并統(tǒng)計(jì)每一組的記錄數(shù)
size1Count = sales.groupby('size1')['size1'].count()
print(size1Count)
# 計(jì)算總銷售數(shù)量
size1Total = size1Count.sum()
print(size1Total)
print(type(size1Count))
# 將Series轉(zhuǎn)換為DataFrame
size1 = size1Count.to_frame(name='銷量')
print(size1)
# 格式化浮點(diǎn)數(shù)
options.display.float_format = '{:,.2f}%'.format
# 插入新的“比例”列
size1.insert(0,'比例', 100 * size1Count / size1Total)
print(size1)
# 將索引名改為“罩杯”
size1.index.names=['罩杯']
print(size1)
# 數(shù)據(jù)可視化
print(size1['銷量'])
# 餅圖要顯示的文本
labels = ['A罩杯','B罩杯','C罩杯','D罩杯']
# 用餅圖繪制銷售比例
size1['銷量'].plot(kind='pie',labels = labels, autopct='%.2f%%')
# 設(shè)置長(zhǎng)寬相同
axis('equal')
legend()
show()
運(yùn)行程序沐批,會(huì)看到在窗口上繪制了如圖3所示的胸罩銷售比例,用 Pandas 分析得到的數(shù)據(jù)與使用 SQL 分析得到的數(shù)據(jù)完全相同蝎亚。
直接在 Python 腳本中使用復(fù)雜的 SQL 語句
如果讀者不想過多使用 Pandas 的 API 進(jìn)行數(shù)據(jù)分析九孩,也可以直接在 Pandas 中使用復(fù)雜的 SQL 語句,一步到位地獲取分析結(jié)果发框。下面的代碼直接通過 SQL 語句分析出了結(jié)果躺彬,最后只是利用 Matplotlib 將數(shù)據(jù)可視化。
# 直接使用復(fù)雜的SQL語句和視圖
from pandas import *
from matplotlib.pyplot import *
import sqlite3
import sqlalchemy
engine = sqlalchemy.create_engine('sqlite:///bra.sqlite')
rcParams['font.sans-serif'] = ['SimHei']
# 執(zhí)行復(fù)雜的SQL語句
sales = read_sql('''
select 'A' as 罩杯, printf('%.2f%%',(100.0 * count(*) / (select count(*) from t_sales where size1 is not null))) as 比例,count(*) as 銷量 from t_sales where size1='A'
union all
select 'B' , printf('%.2f%%',(100.0 * count(*) / (select count(*) from t_sales where size1 is not null))) as 比例,count(*) from t_sales where size1='B'
union all
select 'C' , printf('%.2f%%',(100.0 * count(*) / (select count(*) from t_sales where size1 is not null))) as 比例,count(*)from t_sales where size1='C'
union all
select 'D' , printf('%.2f%%',(100.0 * count(*) / (select count(*) from t_sales where size1 is not null))) as 比例,count(*) from t_sales where size1='D'
order by 銷量 desc
''',engine)
print(sales)
# 將前面的SQL語句建成一個(gè)視圖梅惯,然后執(zhí)行宪拥,效果相同
sales1 = read_sql('select * from v_sales', engine)
labels = ['A罩杯','B罩杯','C罩杯','D罩杯']
sales1['銷量'].plot(kind='pie',labels = labels, autopct='%.2f%%')
axis('equal')
legend()
show()
執(zhí)行上面的程序,會(huì)看到如圖4所示的效果铣减。
用 SQL 語句對(duì)天貓商城胸罩銷售數(shù)據(jù)進(jìn)行分析
我們可以利用 SQL 語句分別統(tǒng)計(jì)天貓和京東關(guān)于胸罩銷售的比例她君,下面現(xiàn)以天貓為例進(jìn)行統(tǒng)計(jì)。
select 'A' as 罩杯,printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where source='天貓' and size1 is not null))) as 比例 from t_sales where size1='A' and source='天貓'
union all
select 'B',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where source='天貓' and size1 is not null))) from t_sales where source='天貓' and size1='B'
union all
select 'C',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where source='天貓' and size1 is not null))) from t_sales where source='天貓' and size1='C'
union all
select 'D',printf("%.2f%%",(100.0 * count(*)/ (select count(*) from t_sales where source='天貓' and size1 is not null))) from t_sales where source='天貓' and size1='D'
上面 SQL 語句的執(zhí)行結(jié)果如圖5所示葫哗。
我們可以看到缔刹,天貓商城胸罩銷售比例與總體銷售比例的趨勢(shì)類似球涛,只是具體的數(shù)值有差異,但仍然是 B 罩杯銷售的最好校镐。
使用 Pandas 分別對(duì)天貓和京東胸罩銷售數(shù)據(jù)進(jìn)行分析
# 分析與可視化天貓和京東胸罩ABCD罩杯的銷售比例
from pandas import *
from matplotlib.pyplot import *
import sqlite3
import sqlalchemy
# 打開數(shù)據(jù)庫(kù)
engine = sqlalchemy.create_engine('sqlite:///bra.sqlite')
rcParams['font.sans-serif'] = ['SimHei']
options.display.float_format = '{:,.2f}%'.format
# 只選取source和size1亿扁,source表示數(shù)據(jù)來源(天貓或京東)
sales = read_sql('select source,size1 from t_sales',engine)
# 過濾天貓胸罩銷售數(shù)據(jù),并按罩杯分組(size1字段)灭翔,統(tǒng)計(jì)出每個(gè)罩杯的具體銷量
tmallSize1GroupCount = sales[sales['source'] == '天貓'].groupby('size1')['size1'].count()
# 計(jì)算出總銷量
tmallSize1Total = tmallSize1GroupCount.sum()
print(tmallSize1Total)
# 將Series轉(zhuǎn)換為DataFrame
tmallSize1 = tmallSize1GroupCount.to_frame(name='銷量')
# 插入一個(gè)“比例”字段魏烫,用于顯示銷售比例
tmallSize1.insert(0,'比例',100 * tmallSize1GroupCount / tmallSize1Total)
# 將索引名改成“罩杯”
tmallSize1.index.names=['罩杯']
print(tmallSize1)
# 京東的分析方式與天貓類似
jdSize1GroupCount = sales[sales['source'] == '京東'].groupby('size1')['size1'].count()
jdSize1Total = jdSize1GroupCount.sum()
print(jdSize1GroupCount)
# 將Series轉(zhuǎn)換為DataFrame
jdSize1 = jdSize1GroupCount.to_frame(name='銷量')
jdSize1.insert(0,'比例',100 * jdSize1GroupCount / jdSize1Total)
jdSize1.index.names=['罩杯']
print(jdSize1)
labels1 = []
labels2 = []
labels1 = tmallSize1.index.tolist()
labels2= jdSize1.index.tolist()
for i in range(len(labels1)):
labels1[i] = labels1[i] + '罩杯'
for i in range(len(labels2)):
labels2[i] = labels2[i] + '罩杯'
# 下面的代碼會(huì)將天貓和京東的胸罩銷售數(shù)據(jù)餅圖放到同一個(gè)窗口顯示
fig,(ax1,ax2) = subplots(1,2,figsize=(12,6))
ax1.pie(tmallSize1['銷量'],labels = labels1, autopct='%.2f%%')
ax2.pie(jdSize1['銷量'],labels = labels2, autopct='%.2f%%')
ax1.legend()
ax2.legend()
ax1.axis('equal')
ax2.axis('equal')
show()
執(zhí)行上面的代碼,會(huì)顯示如圖6所示的胸罩銷售比例統(tǒng)計(jì)圖肝箱。
從圖6的分析結(jié)果可以看出哄褒,天貓和京東的 B 罩杯銷售比例都很大,不過京東 B 罩杯銷售比例特別大煌张,不知道是什么原因?qū)е碌哪派模们艺J(rèn)為到京東買胸罩的大多都是 B 罩杯吧!