python資料視覺化: 使用 pandas
阿新 • • 發佈:2018-12-28
資料
以下是本資料集的13個特徵變數的詳細說明:
- order_id:訂單ID,數字組合而成,例如4283851335。
- order_date:訂單日期,格式為YYYY-MM-DD,例如2013-10-17。
- order_time:訂單日期,格式為HH:MM:SS,例如12:54:44。
- cat:商品一級類別,字串型,包含中文、英文。
- attribution:商品所屬的渠道來源,字串型,包含中文、英文。
- pro_id:商品ID,數字組合而成。
- pro_brand:商品品牌,字串型,包含中文、英文。
- total_money:商品銷售金額,浮點型。
- total_quantity:商品銷售數量,整數型。
- order_source:訂單來源,從哪個渠道形成的銷售,字串型,包含中文、英文。
- pay_type:支付型別,字串型,包含中文、英文。
- use_id:使用者ID,由數字和字母等組成的字串。
- city:使用者訂單時的城市,字串型,中文。
資料清洗
# 模組匯入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 資料載入
dtypes = {'order_id' : np.object,
'pro_id': np.object,
'use_id': np.object}
df = pd.read_csv('abnormal_orders.txt', dtype=dtypes)
df.head(3).T
# 資料行列
df.shape
#(134190, 12)
# 缺失值
df.isna().sum()
不是很多直接捨棄:
# 棄去缺失值
df.dropna(inplace=True)
時間資料處理:
# 合併時間,並更改型別,棄去原來時間
df['datetime'] = (df.order_date + ' ' + df.order_time ).astype('datetime64[ns]')
df.drop(columns=['order_date', 'order_time', 'abnormal_label'], inplace=True)
# 設定時間段
start_time = pd.datetime(2013, 9, 1)
end_time = pd.datetime(2013, 10, 1)
# 根據時間段擷取資料
df_time = df[(df.datetime < end_time) & (df['datetime'] > start_time)]
# 提取一個月中的每天成列
df_time['day'] = df_time.datetime.dt.day
# 獲取各列包含種類
df.nunique()
視覺化
plot.bar()
簡單的柱狀圖
# 每天的訂單量
df_time.day.value_counts().sort_index().plot.bar()
plt.savefig('bar1.png')
新增其他設定:
# 一個月中每個類別商品的品牌數量 使用figsize更改畫幅大小 title設定標題
df_time.pro_brand.groupby(df_time.cat).nunique().plot.bar(
figsize=(10,5),
title='商品品類品牌數量'
)
plt.savefig('bar2.png')
# 一個月中每個類別商品使用者數量 使用color更改顏色
df_time.use_id.groupby(df_time.cat).nunique().plot.bar(figsize=(10,5), color='red')
plt.title('商品品類買家數量')
plt.savefig('bar3.png')
更改字型大小:
# 一個月中每個類別商品商品數量 使用fontsize更改字型大小
df_time.pro_brand.groupby(df_time.cat).nunique().plot.bar(
figsize=(10,5),
color='g',
fontsize=14
)
plt.title('商品品類商品數量', fontsize=16)
堆疊:
# 每種類商品不同渠道獲得訂單量 使用stacked=True進行堆疊
df_time[['cat', 'order_source']].pivot_table(index=['cat'], columns=['order_source'], aggfunc=len, margins=False, fill_value=0).plot.bar(stacked=True)
# 每種商品以不同方式支付的訂單量
pd.crosstab(df_time.cat, df_time.attribution, margins=False).plot.bar(figsize=(8, 5))
plot.barh()
就是把柱狀圖橫過來放
# 不同商品種類商品渠道來源情況
pd.crosstab(df_time.cat, df_time.attribution, margins=False).plot.barh(figsize=(5,6))
plot.pie()
餅狀圖用於描述佔比
# 售賣不同種類商品佔比情況
df_time.cat.value_counts().plot.pie(figsize=(8,8))
plot.line()
折線圖
# 一個月每天的成交金額走勢
df_time.total_money.groupby(df_time.day).sum().plot.line()
# 一個月每天的成交金額, 成交商品量走勢 使用subplots=True進行分圖
pd.DataFrame(df_time.total_money.groupby(df_time.day).sum()).join(df_time.total_quantity.groupby(df_time.day).sum()).plot.line(subplots=True)
plot.area()
面積填充圖
# 一個月每天不同支付方式佔比走勢
pd.crosstab(df_time.day, df_time.pay_type, margins=False).plot.area()
plot.hist()
直方圖:資料分佈情況
# 每天成交金額直方圖
df_time.total_money.groupby(df_time.day).sum().plot.hist()
plot.kde()
核密度估計
# 每天成交金額核密度估計
df_time.total_money.groupby(df_time.day).sum().plot.kde()
plot.scatter()
散點圖
# 成交總金額跟售賣量大體情況
df_time[(df_time.total_money < 100000) & (df_time.total_quantity < 40)].plot.scatter(x='total_quantity', y='total_money')
plot.hexbin()
# 六邊形分箱圖 :密度通過顏色體現
df_time[(df_time.total_money < 100000)].plot.hexbin(x='total_quantity', y='total_money', gridsize=20, cmap="cool")
plot.box()
箱線圖:用於觀察分佈及異常值
# 成交金額箱線圖
df_time[df_time.total_money <1000].total_money.plot.box()
boxplot()
箱線圖:用於觀察分佈及異常值
# 不同支付方式成交金額箱線圖
df_time[df_time.total_money <1000].boxplot(column=['total_money'], by='pay_type')