🌠前言
在参加了一些数据分析的相关比赛之后对比赛进行了一些小总结,比赛结果大部分取决于对所给数据的针对性挖掘,但是数据分析比赛和挖掘赛相比难度不大,基本从上手到参赛只需要一周到半个月,所需要的知识不多,很容易上手的比赛,相关专业的同学可以从此试试入手,数学建模相关的同学也可以试试。
作者自己参加了泰迪杯和大学生数据分析赛,都是含金量不高的比赛,熟练掌握以下知识加上比较流畅的论文叙述就可以拿到二三等奖,当然一等奖还是需要更深度的知识。作者水平不是很好,很多地方还存在错误,但是基本基于自己比赛时候写的代码,希望帮到有志向参加比赛的小伙伴们~
🎆pandas&numpy
import pandas as pd
import numpy as np
数据读入导出
df=pd.read_csv(r'')
df=pd.read_excel(r'')
df.to_csv(r'',encoding='',index=False)
df.to_excel(r'',encoding='',index=False)r'',encoding='',index=False
数据清洗
空缺值的处理
df.isnull().sum()#缺失值汇总
df.isnull().any().any()#查看是否存在空值
df.nunique()#唯一值汇总
df[''].nunique()
df.dropna(inplace=True)#删除包含空格的行
df.fillna('')#用某个值填充所有空缺值
df[''].fillna(np.mean(df[''],inplace=True))#用中值填充
inplace=True #再原始数据上直接修改
去重
print('去重前:',df.shape)
df.drop_duplicates()
print('去重后:',df.shape)
异常值处理
df=df[df['']>100]#只保留部分数据
一般处理
df['1']=df['2']*100
df['1']=df['2']/df['3']
df=df[(df[''].between(0,1))]#范围内保留
df[''].min()
df[''].max()
df.rename(columns={'':''})#某列重命名
df['']=df2['']
选择几列作为新表的常用操作
selected_columns=['1','2']
df=df[selected_columns]
索引
df.set_index('',drop=True)
df.set_index('').reset_index()
drop: 默认为True,表示将原来的索引列删除。如果设置为False,将保留原来的索引列。
.reset_index(): 这一部分将新设置的索引还原为默认的整数索引,并将 '用户索引' 列重新变为一列数据,成为DataFrame的一部分。
loc
df.loc[0,'']#选择某个元素
df.loc[0,:]#选择整行
df.loc[0:1,['','']]#多行多列
df.loc[df['']>10,['','']]#条件选择
GroupBy 数据分组处理
df.groupby(df['']).mean()
df.groupby(df['']).sum()
df.groupby([df['1'],df['2']]).sum()
df['1'].groupby(df['2']).sum()
df['1'].groupby(df['2'],df['3']).sum()#2,3的1
merge 数据合并
pd.merge(df1,df2,on='1',how='inner',suffixes=('',''))
how: 'inner'取交集, 'outer'取并集, 'left'左连接, 'right'右连接。默认是 'inner'
on: 指定用于合并的列名,这是连接的关键字。
left_on、right_on: 分别指定左、右DataFrame中用于合并的列名。
suffixes: 指定在合并相同列名但来自不同DataFrame的列时,为它们添加后缀。
时间处理
df['']=pd.to_datetime(df[''])#转化格式为datetime格式
df['Year']=df[''].dt.year#提取年
df['Month']=df[''].dt.month
df['Day']=df[''].dt.day
df['Hour']=df[''].dt.hour
df['TimeDiff']=df[''].diff()#时间点之间的差异
df[(df['']>='日期1'&df['']<='日期2')]#选取时间范围
创建函数
def 函数名(value):
if 条件(value):
return 0
elif 条件:
return 1
df['']=df[''].apply(函数名)
对值进行分类并打上标签(常用于构建特征)
conditions=[
(df['']>0)&(df['']<7),
(df['']>7)&(df['']<30),
...
]
labels=[3,2,1,0]
df['']=np.select(conditions,labels,default=0)#np.select进行标记添加
#default=0 不满足任何条件默认值
🍻matlab作图
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei']
标签/画布
plt.title('')
plt.xlabel('',fontsize=20)
plt.ylabel('')
plt.figure(figsize=(10,6))
plt.legend()#图例
plt.subplot(总数,行数,列数)#逗号可省略
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False #设置中文字体
plt.xticks(rotation=90)#将图旋转90度
折线图
plt.plot(x轴数据,y轴数据,marker='o',linestyle='-',linewidth=4.0)
plt.plot(x轴数据,y轴数据1,'r--',x轴数据2,y轴数据2,'bs')#多组数据
plt.grid(True)
柱状图
plt.bar(x,y,color='')
#添加柱子的标签
for a,b in zip(x,y):
plt.text(a,b+10,b,ha='center',va='bottom')
#每个柱子的标签
#a:添加文本到x轴位置 b:添加文本y轴位置 b:显示在文本上的数据 ha水平va垂直
bar_width=0.35
index=np.arange(len(标签的数组))
ax.bar(index-bar_width/2,数据数组,bar_width,labels='',color='')
ax.bar(index+bar_width/2,...)
#双柱图
饼图
plt.pie(x,labels=标签数组,autopct='%1.1f%%',wedgeprops=dict(width=0.4, edgecolor='w'))
#labels:每一块饼图外面显示说明的文字 explode:每一块离开中心的距离 startangle:起始绘制角度,默认是从x轴正方向逆时针花旗,如=90则从y轴正方向画起 labeldistance label绘制位置相对于半径的比例 autopct饼图百分比格式设置 pctdistance指定autopct的位置刻度 radius饼图半径
#中间空心:wedgeprops: 用于设置扇形的属性的字典。
#width=0.4: 设置扇形的宽度,即饼图的内半径。该值的范围通常在 0 到 1 之间,0 表示内圆,1 表示整个饼图。
#edgecolor='w': 设置扇形的边缘颜色,这里设置为白色('w')
热力图
导入库
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
sns.set(style='')
sns.heatmap(x,annot=True,cmap='映射类型',fmt='.4f',linewidth=.5,center=0,vmin= ,vmax= )
#style:'whitegrid': 白色网格背景。'darkgrid': 深色网格背景。'white': 白色背景。'dark': 深色背景。'ticks': 显示刻度线的样式。
#cmap: 'viridis'、'plasma'、'cividis'
当选取特征相关性时使用
实用颜色搭配
warm_colors = ['#FF6347', '#FFA07A', '#FFD700', '#FF8C00', '#FF4500']
colors = ['#ff9999', '#ffcc66', '#ff6666']
blue_palette = sns.light_palette("steelblue", as_cmap=False)
💐使用模型
模型分为回归模型和分类模型
回归模型:用于预测连续型的数值
分类模型:对未知的输入进行分类
对于模型的常规操作:
-
X为参照特征,y为要预测的
-
将数据按照一定比例分为训练集和测试集X_train,X_test,y_train,y_test
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
-
使用模型进行训练
-
预测概率
-
模型评估
常见模型
-
使用前确认已经导入
-
n_estimators和random_state是机器学习模型中的两个参数,通常用于配置模型的行为。 -
n_estimators=100表示构建了包含 100 个决策树的集成模型。 -
random_state是一个用于指定随机种子的参数。random_state=42表示设置了随机种子为 42。如果你不设置random_state,模型可能在每次运行时产生不同的结果,这在某些情况下可能会导致结果不可复现。
随机森林
from sklearn.ensemble import RandomForestClassifier
random_forest_model=RandomForestClassfier(n_estimators=100, random_state=42)
random_forest_model.fix(X_train, y_train)#用于解决分类问题,最终的预测结果是得票最多的类别
from sklearn.ensemble import RandomForestRegressor
random_forest_model=RandomForestRegressor(n_estimators=100, random_state=42)#用于解决解决回归问题,最终的预测结果是所有决策树输出的平均值。
LightGBM
from lightgbm import LGBMClassifier
lgbm_model=LGBMClassifier(n_estimators=100, random_state=42)
lgbm_model.fix(X_train, y_train)
from lightgbm import LGBMRegressor
lgbm_regressor = LGBMRegressor(n_estimators=100, random_state=42)
XGBoost
from xgboost import XGBClassifier
xgboost_model = XGBClassifier(n_estimators=100, random_state=42)
xgboost_model.fit(X_train, y_train)
from xgboost import XGBRegressor
xgb_regressor = XGBRegressor(n_estimators=100, random_state=42)
预测概率
predictions = loaded_model.predict(new_data)
predictions = model.predict(X_test)#例子
模型评估
-
准确率(Accuracy):计算模型在测试集上的准确率,即正确预测的样本数占总 样本数的比例。
accuracy = accuracy_score(y_test, new_data)
-
混淆矩阵(Confusion Matrix):混淆矩阵是一个表格,显示模型的预测结果与 实际标签之间的关系。它包括真正例、真负例、假正例和假负例。
conf_matrix = confusion_matrix(y_test,new_data )
-
F1 分数(F1-Score): 是精确度和召回率的调和平均值,综合考虑了二者2×Precision×Recall /Precision+Recall
-
精确度(Precision): 表示在模型预测为正例的样本中,有多少是真正的正例: 𝑇𝑃/𝑇𝑃+𝐹𝑁
-
召回率(Recall): 表示在实际正例中,有多少被模型正确预测为正例: 𝑇𝑃/𝑇𝑃+𝐹𝑁
🎉常见简单分析过程
- 进行数据清洗
- 特征工程:进行特征选取,对原始数据进行特征提取,再根据特征再进行组合创造新的特征,之后可能根据特征重要性再选取.
- 绘图,可视化数据
- 根据特征创建模型进行预测