背景知识
亚足联AFC:
1954年成立,总部马来西亚吉隆坡。
负责管理亚洲区足球事务,举办各项国家级及俱乐部级赛事,协助国际足联举行世界杯预选赛及4年一度的亚洲杯。
47个成员协会,包括阿富汗、缅甸、中国台北、中国香港、印度尼西亚、日本、韩国、巴基斯坦、菲律宾、新加坡、越南等。
分为两大势力——东亚及西亚,东亚包括有日本、韩国、中国、澳大利亚(来自大洋洲的澳大利亚于2006年加入亚足联),西亚有伊拉克、沙特阿拉伯、阿联酋等。
2018俄罗斯世界杯:
5大洲足联的32支球队参赛
东道主俄罗斯自动获得参赛资格
其余31支通过各大洲足联举办的预选赛事获得参赛资格(如,亚足联举办的亚洲区预选赛)
2018世界杯亚洲区预选赛:
预选赛12强赛,分两组,两组前两名直接晋级世界杯决赛,两组第3名之间的胜者获得附加赛资格。
数据
2019年国际足联的世界排名+2015年亚洲杯排名+2018俄罗斯世界杯排名(只有进入决赛的亚足联国家才有实际排名)
我这里选了20支球队
import pandas as pd
data= pd.read_csv(r"G:\case\data\footballRank.csv")
data.head()
国家 | 2019国际排名 | 2018世界杯 | 2015亚洲杯 | |
---|---|---|---|---|
0 | 中国 | 73 | 40 | 7 |
1 | 日本 | 60 | 15 | 5 |
2 | 韩国 | 61 | 19 | 2 |
3 | 伊朗 | 34 | 18 | 6 |
4 | 沙特 | 67 | 26 | 10 |
思路
要用k-means模型,k-means是用距离做相似性度量的,先要做数据标准化,消除不同量纲级别带来的影响,使各维度上的量纲等价。
1、数据标准化
2、建模,用k-means做聚类
创建k-means模型:
KMeans(n_clusters=8, init=‘k-means++’, n_init= 10, max_iter=300, tol=0.0001, precompute_distances=‘auto’, verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm=‘auto’)
n_clusters: 即k值,一般需要多试一些k值。可以随机设置一些k值,选聚类效果最好的。
init: 初始值(初始中心点)选择的方式,默认是采用优化过的k-means++方式。也可以自己指定中心点,或者采用random完全随机的方式,一般推荐用优化过的k-means++方式。自己设置一般是对于个性化的数据进行设置,很少采用。
n_init: 初始化中心点的运算次数,默认是10。模型是否能快速收敛和中心点的选择关系非常大,所以在选中心点上多花一些时间,来争取整体时间上的快速收敛是值得的。每一次中心点是随机生成的,所以要多运行几次,选择最好的做初始中心点。k值比较大,可以适当增大n_init值。
max_iter: 最大迭代次数。如果聚类很难收敛的话,设置max_iter可以确保结束长时间运行。
algorithm: k-means的实现算法,三种取值:“auto”、“full”、“elkan”。推荐采用默认的“auto”。'full’采用传统的K-Means算法,‘auto会根据数据的特点自动选择full还是elkan。
fit(data)可以对data做聚类,predict(data)可以对每一个样本,计算最近的类
实验
1、Z-score标准化
k-means用距离度量相似度,需要做数据规范化,我采用了其中的标准化方法:Z-score。用来消除不同量纲级别带来的误差。
import numpy as np
from sklearn import preprocessing
train_x=data[['2019国际排名','2018世界杯', '2015亚洲杯']]
scaled_x= preprocessing.scale(train_x)
d:\python27\lib\site-packages\ipykernel_launcher.py:1: DataConversionWarning: Data with input dtype int64 were all converted to float64 by the scale function.
"""Entry point for launching an IPython kernel.
scaled_x
array([[-0.5842676 , 0.05223517, -0.64677721],
[-0.97679881, -2.12423024, -1.03291285],
[-0.9466041 , -1.77599577, -1.61211632],
[-1.76186121, -1.86305439, -0.83984503],
[-0.76543585, -1.16658546, -0.06757374],
[-0.04076286, 0.05223517, -1.22598067],
[ 0.26118422, 0.05223517, 0.51162973],
[-0.34270994, 0.05223517, -0.83984503],
[-0.13134698, 0.05223517, -0.45370938],
[ 0.89527309, 0.05223517, 1.28390102],
[ 0.29137893, 0.92282133, 1.28390102],
[-0.16154169, 0.92282133, 0.31856191],
[ 0.71410485, 0.92282133, 0.12549408],
[ 0.5329366 , 0.92282133, 0.70469755],
[ 2.16345083, 0.92282133, 1.28390102],
[-1.58069297, -0.81835099, -1.80518414],
[-0.49368348, 0.05223517, 1.28390102],
[ 0.77449426, 0.92282133, -0.26064156],
[ 2.042672 , 0.92282133, 0.89776537],
[ 0.11021068, 0.92282133, 1.0908332 ]])
2、k-means做聚类
from sklearn.cluster import KMeans
K值选几呢?
选3,将亚洲足球划分为3个梯队
k=3
model= KMeans(n_clusters= k, init='k-means++', n_init=10, max_iter= 300)
clf= model.fit(scaled_x)
pre_y= clf.predict(scaled_x)
#concat合并
result= pd.concat([data, pd.DataFrame(pre_y)], axis=1)
result
国家 | 2019国际排名 | 2018世界杯 | 2015亚洲杯 | 0 | |
---|---|---|---|---|---|
0 | 中国 | 73 | 40 | 7 | 1 |
1 | 日本 | 60 | 15 | 5 | 2 |
2 | 韩国 | 61 | 19 | 2 | 2 |
3 | 伊朗 | 34 | 18 | 6 | 2 |
4 | 沙特 | 67 | 26 | 10 | 2 |
5 | 伊拉克 | 91 | 40 | 4 | 1 |
6 | 卡塔尔 | 101 | 40 | 13 | 0 |
7 | 阿联酋 | 81 | 40 | 6 | 1 |
8 | 乌兹别克斯坦 | 88 | 40 | 8 | 1 |
9 | 泰国 | 122 | 40 | 17 | 0 |
10 | 越南 | 102 | 50 | 17 | 0 |
11 | 阿曼 | 87 | 50 | 12 | 0 |
12 | 巴林 | 116 | 50 | 11 | 0 |
13 | 朝鲜 | 110 | 50 | 14 | 0 |
14 | 印尼 | 164 | 50 | 17 | 0 |
15 | 澳洲 | 40 | 30 | 1 | 2 |
16 | 叙利亚 | 76 | 40 | 17 | 0 |
17 | 约旦 | 118 | 50 | 9 | 0 |
18 | 科威特 | 160 | 50 | 15 | 0 |
19 | 巴勒斯坦 | 96 | 50 | 16 | 0 |
根据聚类结果可以看到:
日本、韩国、伊朗、沙特、澳洲为一梯队
中国、伊拉克、阿联酋、乌兹别克斯坦为一梯队
卡塔尔、泰国、越南、阿曼、巴林、朝鲜、印尼、叙利亚、约旦、科威特、巴勒斯坦为一梯队