数据挖掘小案例

数据挖掘步骤

一 、数据取样:

对数据进行精选,以保证数据的科学性、有效性、均衡性等。
二、数据探索与预处理:

对数据的特征进行探索,对数据进行清洗(去除错误数据、去除噪声、填补缺失值等过程),特征提取,降维等操作,数量、异常值、缺失值等。对数据进行标准化。
三、模式发现:

发现问题是属于哪一类,选取合适的数据挖掘方法。
四、构建模型:

将经过预处理之后的可用数据代入模型进行数据挖掘。
五、模型评价:

对构建的模型进行评价(不同类别的模型评价方法可能不同),若效果不理想,则进一步调整模型。

为什么选择这个案例?

1.辅助媒体产出奥运会相关文案

数据记录了120年的奥运会参赛国家、人员以及成绩等相关信息,案例主要从运动员身高与体重的角度进行分析, 总览奥运会发展的历史过程。分析结果可帮助媒体行业向用户更直观展示奥运会的发展过程,拉动用户兴趣,增加活跃度。
2.把实际问题转化为数学模型,达到学以致用的目的。

一 、数据取样

数据集包括从1896年雅典奥运会到2016年里约奥运会的所有比赛,数据源下载地址:https://www.juhe.cn/market/product?id=10246
下载完成有两个文件:athlete_events.csv以及noc_regions.csv,下面是数据概览,如果直接想要数据集的可以在下方留言。
(1) athlete_events.csv文件: 记录着运动员赛事(运动员的名字,参加的比赛,体重等等) 文件说明: 该文件包含271116行和15列;每行对应一个运动员参加单个奥林匹克项目(运动员项目)的情况。
ID--------每个运动员的唯一编号;
Name------运动员的名字;
Sex-------M or F;
Age-------岁数(整数);
Height----身高(厘米);
Weight----重量(千克);
Team------所属团队名称;
NOC-------国家奥委会三字母代码3-letter code;
Games-----哪一年哪个季节的项目;
Year------年份(整数);
Season----夏季或冬季;
City------主办城市;
Sport-----体育活动;
Event-----事件(项目名);
Meda1-----金,银,铜或NA;

(2)noc_regions.csv 文件:记录着国家奥委会地区信息(National Olympic Committee,缩写为NOC)

导入相关的库

import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
import os 

读取文件,获取数据集

dirpath = 'E:\Jupyter\A\B'
data = pd.read_csv(os.path.join(dirpath, 'athlete_events.csv'))
regions = pd.read_csv(os.path.join(dirpath, 'noc_regions.csv'))
#通过已知信息,我们发现文件1和文件2的NOC字段相同,采用左连接将两个文件连接起来
merged = pd.merge(data, regions, on='NOC', how='left')

打印前五行数据

# 过滤出金牌数据
goldMedals = merged[(merged.Medal == 'Gold')]
#打印出前五行数据
goldMedals.head()

在这里插入图片描述

二、数据探索与预处理

检查年龄是否有NaN

goldMedals.isnull().any()

在这里插入图片描述
#显示数据的基本信息

goldMedals.info()

在这里插入图片描述
#过滤出非空的值

notNullMedals = goldMedals[(goldMedals['Height'].notnull()) & (goldMedals['Weight'].notnull())]
#再查看一下非空数据的信息 
notNullMedals.head()

在这里插入图片描述
#pandas的describe可以用来展示数据的一些描述性统计信息

notNullMedals.describe()

在这里插入图片描述

三、模式发现

选择线性回归算法, 人的身高和体重是两种相关性的量,可以用回归分析来分析。

通过seaborn可视化快速简便地探索数据集

plt.subplots(figsize=(10, 6))
plt.xlabel('Height', fontsize=12)
plt.ylabel('Weight', fontsize=12)
plt.title('Height and Weight')
# 绘制数据并拟合出数据的线性回归模型
sns.regplot(x='Height', y='Weight', data=notNullMedals,ci=None)
#默认参数ci=95,置信度(指的是发生事件A的基础上发生事件B的概率,即条件概率)为0.95的置信区间,此处数据过多,设为None线性回归拟合。

在这里插入图片描述
特殊值数据
箱型图

plt.figure(figsize=(20,10))
plt.tight_layout() # 紧凑型布局,图更干净好看
sns.boxplot('Height', 'Weight', data=notNullMedals)
plt.rcParams['font.sans-serif'] = ['SimHei']#添加中文字体支持
plt.rcParams['axes.unicode_minus'] = False  #添加中文字体支持
plt.xticks(rotation=90)
plt.title('金牌运动员身高体重关系')

在这里插入图片描述
我们发现,基本在回归线上,但是有一些是比较异常的,下面查看体重大于120公斤的参加的是什么项目

notNullMedals.loc[notNullMedals['Weight'] > 120]

在这里插入图片描述
查询可知,主要包括了以下三种运动项目,举重项目对体重的要求确实要高,不同级别的体重只能参加不同级别的赛事
Athletics 竞技;田径运动
Weightlifting 举重
Judo 柔道

男女分类,比较男性和女性的身高体重关系还是有区别的。

Men_Medals   = notNullMedals[(notNullMedals.Sex == 'M')]
Women_Medals = notNullMedals[(notNullMedals.Sex == 'F')]
Men_Medals.info()#男金牌运动员信息
Women_Medals.info()#女金牌运动员信息

四、构建模型

采用线性模型,为什么不采用逻辑回归?
线性回归要求因变量必须是连续性数据变量;逻辑回归要求因变量必须是分类变量,二分类或者多分类的;比如要分析性别、年龄、身高、饮食习惯对于体重的影响,如果这个体重是属于实际的重量,是连续性的数据变量,这个时候就用线性回归来做;如果将体重分类,分成了高、中、低这三种体重类型作为因变量,则采用logistic回归。

下面按照男运动员和女运动员来分析
分训练集和测试集,train_x,train_y为训练集,test_x和test_y 为测试集

男运动员

#utils模块的shuffle方法打乱数集
import sklearn.utils as su 

x = Men_Medals['Height']
y = Men_Medals['Weight']

#打乱原始数据集的输入和输出
#random_state随机种子,下次random_state=7生成的打乱顺序一样
x,y = su.shuffle(x,y,random_state=7)
train_size = int (len(x)*0.8)#8/2
train_x,test_x,train_y,test_y = x[:train_size],x[train_size:],y[
  • 41
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值