步骤一:了解需求背景和挖掘目标;
步骤二:分析并建立流程图;

步骤三:探索,并处理数据;
步骤四:数据建模及应用,及可视化;
实现代码:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans # 引入sklearn模块里的机器学习算法 k_means
class AirLightData():
def detectData(self, filePath):
'''
探索数据
:param filePath:文件路径
:return: 无 (数据的DF结构 (dataframe))
'''
df = pd.read_csv(filePath)
describe = df.describe(include='all')
print(describe.T)
# df.to_excel('data/air_data.xls')
describe.T.to_excel('data/air_descrlib.xls')
pass
def cleanData(self,filePath):
'''
清洗掉无效数据:空值行、不在合理的数据范围内的行
:param filePath:
:return:
'''
df = pd.read_csv(filePath)
# 就是用布尔(bool)索引过滤
# 过滤非法的票价
filter1 = df['SUM_YR_1'].notnull() | df['SUM_YR_2'].notnull() # 过滤同为空
filter2 = (df['SUM_YR_1'] != 0) | (df['SUM_YR_2'] != 0)
filter3 = df['avg_discount'] != 0
filter4 = df['SEG_KM_SUM'] != 0
filter = filter1 & filter2 & filter3 & filter4
df = df[filter]
df.to_excel('data/air_cleaned.xls')
# 过滤非法的 里程数 和 折扣率%
pass
def chooseData(self, filePath):
'''
从清洗之后的数据选取需要的列
:param filePath:
:return:
'''
df = pd.read_excel(filePath)
df = df[['FFP_DATE', 'LOAD_TIME', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'LAST_TO_END', 'avg_discount']]
df.to_excel('data/air_coredata.xls')
pass
def transformData(self, filePath):
df = pd.read_excel(filePath)
df['L'] = (pd.to_datetime(df['LOAD_TIME'])-pd.to_datetime(df['FFP_DATE']))/30
df['R'] = df['LAST_TO_END']/30
df['F'] = df['FLIGHT_COUNT']
df['M'] = df['SEG_KM_SUM']
df['C'] = df['avg_discount']
df = df[['L', 'R', 'F', 'M', 'C']]
df.to_excel('data/air_coretransformdata.xls')
pass
def standarData(self,filePath):
'''
一般标准化的方式:(原数据-平均值)/ 标准差
:param filePath:
:return:
'''
df = pd.read_excel(filePath)
df = (df - np.mean(df, axis=0))/np.std(df, axis=0)
df[['L', 'R', 'F', 'M', 'C']].to_excel('data/air_stdcoredata.xls')
pass
def classifyData(self, filePath, k=5):
df = pd.read_excel(filePath)
kmeans = KMeans(k)
kmeans.fit(df[['L', 'R', 'F', 'M', 'C']])
print(kmeans.cluster_centers_)
print(kmeans.labels_)
df['label'] = kmeans.labels_
# df.to_excel('data/air_result.xls')
# corData = pd.DataFrame(kmeans.cluster_centers_)
# corData.to_excel('data/air_core.xls')
corData = np.array(kmeans.cluster_centers_)
# 绘制雷达图
# 1、组织数据
# 构造x轴轴值
xdata = np.linspace(0, 2*np.pi, k,endpoint=False)
xdata = np.concatenate((xdata, [xdata[0]]))
ydata1 = np.concatenate((corData[0], [corData[0][0]]))
ydata2 = np.concatenate((corData[1], [corData[1][0]]))
ydata3 = np.concatenate((corData[2], [corData[2][0]]))
ydata4 = np.concatenate((corData[3], [corData[3][0]]))
ydata5 = np.concatenate((corData[4], [corData[4][0]]))
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(xdata, ydata1, 'bo--', linewidth=1,label='customer1')
ax.plot(xdata, ydata2, 'ro--', linewidth=1, label='customer2')
ax.plot(xdata, ydata3, 'go--', linewidth=1, label='customer3')
ax.plot(xdata, ydata4, 'yo--', linewidth=1, label='customer4')
ax.plot(xdata, ydata5, 'co--', linewidth=1, label='customer5')
ax.set_thetagrids(xdata * 180 / np.pi, ['L', 'R', 'F', 'M','C'])
ax.set_rlim(-3, 3)
plt.legend(loc='best')
plt.show()
pass
pass
if __name__ == "__main__":
ad = AirLightData()
# ad.detectData('data/air_data.csv')
# ad.cleanData('data/air_data.csv')
# ad.chooseData('data/air_cleaned.xls')
# ad.transformData('data/air_coredata.xls')
# ad.standarData('data/air_coretransformdata.xls')
ad.classifyData('data/air_stdcoredata.xls', k=5)
pass
最后效果展示: