Dieser Artikel stammt aus dem öffentlichen WeChat-Konto „Youerhut“, verfasst von Youerhut. Um diesen Artikel erneut zu drucken, wenden Sie sich bitte an das öffentliche Youerhut-Konto.
Hallo zusammen, ich bin Peter~
Ich habe kürzlich ein Stück E-Commerce-Daten zu IC-Elektronikprodukten erhalten und werde später Datenanalyse und Mining zu drei Themen durchführen:
Dieser Artikel ist die erste Stufe . Der Hauptinhalt umfasst:
In [1]:
import pandas as pd import numpy as np import time import os from datetime import datetime import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline #设置中文编码和负号的正常显示 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False import plotly_express as px import plotly.graph_objects as go import missingno as ms from sklearn.cluster import KMeans from sklearn.preprocessing import MinMaxScaler
df = pd.read_csv( "ic_sale.csv", encoding="utf-8",# 指定编码 cnotallow={"order_id":str,"product_id":str,"category_id":str,"user_id":str} # 指定字段类型 ) df.head()
Die Rolle des Konverterparameters: Die mehreren ID-Felder in den Daten sind alle Zahlen, die in der CSV- oder Excel-Datei als Zahlen behandelt werden (ausgedrückt in wissenschaftlicher Notation); im Wesentlichen handelt es sich um „Zeichenfolgen“. „Informationen gibt es nicht.“ irgendeine Bedeutung. Sie müssen beim Lesen den Typ angeben.
Überprüfen Sie nach dem Einlesen die Basisinformationen der Daten:
In [3]:
# 1、数据shape df.shape
Out[3]:
(564169, 11)
In [4]:
# 2、数据字段类型 df.dtypes
Out [4 ]:
event_timeobject order_idobject product_idobject category_id object category_code object brand object pricefloat64 user_id object ageint64 sex object local object dtype: object
In [5]:
Beschreibende Statistiken gelten für numerische Felder:
# 3、数据描述统计信息 df.describe()
Out[5]:
Preis | Alter: 564169,000000 | 208.269324|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33.184388 | std | 304.559875 0... 50 % | 87,940000 | 33,000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
75 % | 277,750000 | 42.000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
max | 18328.680000 | 50.000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
In [6]: # 4、总共多少个不同客户 df["user_id"].nunique() Nach dem Login kopieren Out[6]: 6908 Nach dem Login kopieren In [7]: # 5、总共多少个不同品牌 df["brand"].nunique() Nach dem Login kopieren Out[7]: 868 Nach dem Login kopieren In [8]: # 6、总共多少个订单 df["order_id"].nunique() Nach dem Login kopieren Out[8]: 234232 Nach dem Login kopieren In [9]: # 7、总共多少个产品 df["product_id"].nunique() Nach dem Login kopieren Out[9]: 3756 Nach dem Login kopieren 数据预处理数据筛选从描述统计信息中发现price字段的最小值是0,应该是没有成交的数据;我们选择price大于0的信息: In [10]: df = df[df["price"] > 0] Nach dem Login kopieren 缺失值处理缺失值情况In [11]: df.isnull().sum() Nach dem Login kopieren Out[11]: event_time0 order_id0 product_id0 category_id 0 category_code129344 brand 27215 price 0 user_id 0 age 0 sex 0 local 0 dtype: int64 Nach dem Login kopieren 可以看到缺失值体现在字段:
In [12]: ms.bar(df,color="blue")# 缺失值可视化 plt.show() Nach dem Login kopieren 缺失值填充In [13]: df.fillna("missing",inplace=True) Nach dem Login kopieren In [14]: df.isnull().sum()# 填充之后无缺失值 Nach dem Login kopieren Out[14]: event_time 0 order_id 0 product_id 0 category_id0 category_code0 brand0 price0 user_id0 age0 sex0 local0 dtype: int64 Nach dem Login kopieren 时间字段处理字段类型转化读进来的数据中时间字段是object类型,需要将其转成时间格式的类型 In [15]: df["event_time"][:5] # 处理前 Nach dem Login kopieren Out[15]: 02020-04-24 11:50:39 UTC 12020-04-24 11:50:39 UTC 22020-04-24 14:37:43 UTC 32020-04-24 14:37:43 UTC 42020-04-24 19:16:21 UTC Name: event_time, dtype: object Nach dem Login kopieren In [16]: # 去掉最后的UTC df["event_time"] = df["event_time"].apply(lambda x: x[:19]) Nach dem Login kopieren In [17]: # 时间数据类型转化:字符类型---->指定时间格式 df['event_time'] = pd.to_datetime(df['event_time'], format="%Y-%m-%d %H:%M:%S") Nach dem Login kopieren 字段衍生In [18]: # 提取多个时间相关字段 df['month']=df['event_time'].dt.month df['day'] = df['event_time'].dt.day df['dayofweek']=df['event_time'].dt.dayofweek df['hour']=df['event_time'].dt.hour Nach dem Login kopieren In [19]: df["event_time"][:5] # 处理后 Nach dem Login kopieren Out[19]: 0 2020-04-24 11:50:39 1 2020-04-24 11:50:39 2 2020-04-24 14:37:43 3 2020-04-24 14:37:43 4 2020-04-24 19:16:21 Name: event_time, dtype: datetime64[ns] Nach dem Login kopieren 可以看到字段类型已经发生了变化 整体趋势分析分析1:每月成交金额多少?In [20]: amount_by_month = df.groupby("month")["price"].sum().reset_index() amount_by_month Nach dem Login kopieren Out[20]:
In [21]: fig = px.scatter(amount_by_month,x="month",y="price",size="price",color="price") fig.update_layout(height=500, width=1000, title_text="每月成交金额") fig.show() Nach dem Login kopieren 可以看到:
分析2:月订单量如何变化?In [22]: order_by_month = df.groupby("month")["order_id"].nunique().reset_index() order_by_month Nach dem Login kopieren Out[22]:
In [23]: fig = px.line(order_by_month,x="month",y="order_id") fig.update_layout(height=500, width=1000, title_text="每月成交订单量") fig.show() Nach dem Login kopieren 关于订单量:
分析3:月消费人数/人次如何变化?In [24]: # nunique:对每个user_id进行去重:消费人数 # count:统计user_id 的次数;消费人次(存在一人多次购买) people_by_month = df.groupby("month")["user_id"].agg(["nunique","count"]).reset_index() people_by_month Nach dem Login kopieren Out[24]:
In [25]: fig = px.line(people_by_month,x="month",y="nunique") fig.update_layout(height=500, width=1000, title_text="每月成交人数") fig.show() Nach dem Login kopieren fig = px.line(people_by_month,x="month",y="count") fig.update_layout(height=500, width=1000, title_text="每月成交人次") fig.show() Nach dem Login kopieren 分析4:每月订单价多少?In [27]: amount_by_month# 每月成交金额 Nach dem Login kopieren Out[27]:
In [28]: order_by_month# 每月订单数 Nach dem Login kopieren Out[28]:
In [29]: amount_by_userid = pd.merge(amount_by_month,order_by_month) amount_by_userid Nach dem Login kopieren Out[29]:
In [30]: amount_by_userid["average"] = amount_by_userid["price"] / amount_by_userid["order_id"] amount_by_userid Nach dem Login kopieren fig = px.line(amount_by_userid,x="month",y="average") fig.update_layout(height=500, width=1000, title_text="每月客单价") fig.show() Nach dem Login kopieren 从上面的折线图可以看出来:
分析5:每个订单包含多少产品In [32]: product_by_order = df.groupby("order_id")["product_id"].count().reset_index().sort_values("product_id",ascending=False) product_by_order.head(10) Nach dem Login kopieren Out[32]:
In [33]: fig = px.bar(product_by_order[:20], x="order_id", y="product_id", text="product_id" ) fig.show() Nach dem Login kopieren 一个订单下包含的产品数量是不同;上万的订单可能是小型的ic元器件产品。 不同省份对比分析6:订单量、用户量和成交金额对比不同省份下的订单量、用户量和成交金额对比 In [34]: local = df.groupby("local").agg({"order_id":"nunique","user_id":"nunique","price":sum}).reset_index() local.head() Nach dem Login kopieren Out[34]:
In [35]: df1 = local.sort_values("order_id",ascending=True)# 订单量升序 df1 Nach dem Login kopieren Out[35]:
|