[Le 2e Dingding Cup College Student Big Data Challenge en 2023] Tour préliminaire B : Prévision et analyse de l'utilisation des vélos publics à New York, États-Unis Prévision de trois séries chronologiques Analyse de code Python

2023 2nd Dingding Cup College Student Big Data Challenge Tour préliminaire B : Problème de prévision et d'analyse de l'utilisation des vélos publics Trois prévisions de séries chronologiques Analyse de code Python à New York, États-Unis

insérez la description de l'image ici

Liens connexes

[Le 2e Dingding Cup College Student Big Data Challenge en 2023] Tour préliminaire B : Prévision et analyse de l'utilisation des vélos publics à New York, États-Unis - Analyse de code Python

[Le 2e Dingding Cup College Student Big Data Challenge en 2023] Tour préliminaire B : Prévision et analyse de l'utilisation des vélos publics Problème 2 à New York, États-Unis Analyse de code Python

[Le 2e Dingding Cup College Student Big Data Challenge en 2023] Tour préliminaire B : Prévision et analyse de l'utilisation des vélos publics à New York, États-Unis Prévision de trois séries chronologiques Analyse de code Python

1 sujet

Citi Bike est un programme de voyage en partage de vélos lancé par la ville de New York en 2013, sponsorisé par Citi Bank et nommé "Citi Bike". Il y a 8 000 vélos et 500 stations à Manhattan, Brooklyn, Queens et Jersey City. Offrir aux résidents et aux touristes de New York un moyen pratique, rapide et économique de se déplacer à vélo. Les gens peuvent emprunter auprès de Citi Bank n'importe où et le rendre à leur destination. Dans ce cas, les données comportent deux parties : la première partie est le débitmètre des transactions d'emprunt et de retour de vélos publics à New York. Les vélos Citi Bik sont différents des vélos partagés. Ils ne peuvent pas être empruntés et rendus n'importe où en scannant le code QR avec un téléphone portable, mais doivent être empruntés et rendus en utilisant des stations de vélos fixes. L'ensemble de données comprend un total de 38 vélos de Du 1er juillet 2013 au 31 août 2016. Données mensuelles (1158 jours), un fichier par mois. Parmi eux, le format de données de juillet 2013 à août 2014 est différent de celui des autres années et mois, ce qui se reflète spécifiquement dans les différents formats de stockage des variables starttime et stoptime.

La deuxième partie contient les données météorologiques pour cette période à New York et est stockée dans le fichier weather_data_NYC.csv, qui contient des données météorologiques au niveau horaire de 2010 à 2016.

Tableau des champs de données sur les vélos publics

nombre variable Nom de variable signification variable Valeur et description de la variable
1 durée du voyage temps de voyage Temps de conduite, valeur numérique, secondes
2 Heure de début heure de départ Heure d'emprunt, chaîne, m/j/AAAA HH:MM:SS
3 temps d'arrêt Heure de fin Heure de retour, chaîne, m/j/AAAA HH:MM:SS
4 identifiant de la station de départ Numéro de la station d'emprunt Variable qualitative, numéro unique du site
5 nom de la station de départ nom du site de location de voiture chaîne
6 latitude de la station de départ dimensions du site de location de voitures numérique
7 longueur de la station de départ Longitude de l'agence de location de voitures numérique
8 identifiant de station terminale Retourner le numéro de la station Variable qualitative, numéro unique du site
9 nom de la station finale Renvoyer le nom de la station chaîne
dix latitude de la station terminale Latitude de la gare de retour numérique
11 longitude de la station finale Longitude de la station de retour numérique
12 identifiant de la bile numéro de vélo Variable qualitative, numéro de vélo unique
13 Type d'utilisation type d'utilisateur Abonné : abonnement annuel ; Client : abonnement temporaire 24h ou 7 jours
14 Année de naissance année de naissance Seule cette colonne a des valeurs manquantes
15 genre genre 0 : inconnu 1 : masculin 2 : féminin

Tableau de profil des champs de données météorologiques

nombre variable Nom de variable signification variable Valeur et description de la variable
1 date date chaîne
2 temps temps EDT (Eastern Daylight Timing) fait référence à l'unité d'heure d'été de l'est des États-Unis
3 température température de l'air Unité : ℃
4 dew_poit point de rosée Unité : ℃
5 humidité humidité pourcentage
6 pression pression au niveau de la mer Unité : hPa
7 visibilité visibilité Unité : kilomètres
8 direction du vent direction du vent Type discret, les catégories incluent ouest, calme, etc.
9 vitesse du vent vitesse du vent Unité : kilomètres par heure
dix instant_wind_speed vitesse instantanée du vent Unité : kilomètres par heure
11 précipitation précipitation Unité : mm, il manque des valeurs
12 activité Activité Type discret, les catégories incluent la neige, etc.
13 conditions État Discret, les catégories comprennent le ciel couvert, la neige légère, etc.
14 WindDirDegrés angle du vent Type continu, la valeur est de 0 à 359
15 DateUTC GMT AAAA/m/j HH:MM

Deux, résoudre le problème

  1. Réalisation d'état d'emprunt et de restitution de vélo :

Réalisez le diagramme de réseau de la situation d'emprunt et de retour de vélos à chaque station en une journée. Le diagramme de réseau est un graphique orienté, et la flèche pointe de la station d'emprunt à la station de retour (de nombreuses stations ont des enregistrements d'emprunt et de retour en même temps , donc la plupart des stations sont entre deux. connexion bidirectionnelle).

(1) Prenant le 3 août 2014 comme exemple pour effectuer une analyse de réseau, réaliser le graphe de réseau d'emprunt et de retour de vélos et calculer le nombre de nœuds, d'arêtes et de densité de réseau du graphe de réseau (indiquant le nombre d'arêtes compte pour le proportion de toutes les connexions possibles), le processus de calcul et les résultats du dessin sont donnés.

(2) À l'aide du diagramme d'analyse de réseau mentionné ci-dessus, analysez la zone LAN avec une longitude comprise entre 40,695 et 40,72 et une latitude entre -74,023 et -73,973, et calculez la longueur moyenne du chemin le plus court (la longueur du chemin le plus court entre tous les points est la moyenne arithmétique calculée ) et le diamètre du réseau (la valeur maximale du chemin le plus court dans le réseau défini).

  1. L'analyse par grappes

Effectuez une analyse de cluster sur les données de vélo de l'ensemble de données du 1er juillet 2013 au 31 août 2015, sélectionnez une valeur K de numéro de cluster appropriée, sélectionnez au moins deux algorithmes de clustering pour le clustering, comparez différentes méthodes de clusters et analysez les résultats de clustering .

  1. Analyse prévisionnelle du volume d'emprunt de voitures sur le site :

Prévoyez le volume d'emprunt de vélos publics dans toutes les stations et prédisez le futur volume d'emprunt d'une journée. Les données de juillet 2013 à juillet 2015 sont utilisées comme ensemble d'entraînement, et les données du 1er au 31 août 2015 sont utilisées comme ensemble de test pour prédire le volume quotidien de location de vélos du 1er au 31 août 2015. Donnez le MAPE des résultats de prédiction de chaque site, et donnez le nombre de paramètres du modèle, et enfin calculez la valeur moyenne du MAPE de tous les sites (Remarque : l'ensemble de test ne peut pas participer à l'entraînement et à la vérification, sinon il sera traité comme une infraction).
MAPE = 1 n ∑ ∣ yi − yi ^ yi ∣ × 100 % MAPE = \frac{1}{n} \sum{|\frac{y_i-\hat{y_i}}{y_i}|} \times 100\%M A PE=n1yjeyjeyje^×100%

data.csv correspond aux informations sur le flux de transactions des vélos publics à New York. Le format est le suivant. Veuillez utiliser python pour effectuer une analyse de cluster après le prétraitement des données et l'ingénierie des fonctionnalités :

Tableau des champs de données sur les vélos publics

nombre variable Nom de variable signification variable Valeur et description de la variable
1 durée du voyage temps de voyage Temps de conduite, valeur numérique, secondes
2 start time 出发时间 借车时间,字符串,m/d/YYY HH:MM:SS
3 stop time 结束时间 还车时间,字符串,m/d/YYY HH:MM:SS
4 start station id 借车站点编号 定性变量,站点唯一编号
5 start station name 借车站点名称 字符串
6 start station latitude 借车站点维度 数值型
7 start station longtude 借车站点经度 数值型
8 end station id 还车站点编号 定性变量,站点唯一编号
9 end station name 还车站点名称 字符串
10 end station latitude 还车站点纬度 数值型
11 end station longitude 还车站点经度 数值型
12 bile id 自行车编号 定性变量,自行车唯一编号
13 Use type 用户类型 Subscriber:年度用户; Customer:24小时或者7天的临时用户
14 birth year 出生年份 仅此列存在缺失值
15 gender 性别 0:未知 1:男性 2:女性

2 问题分析

2.1 问题一

  1. 绘制有向图

a. 读入数据并分别提取“起始站点编号”和“结束站点编号”两列数据,构建自行车借还网络图。

b. 对于第一步构建的网络图,我们需要计算网络图的节点数,边数,网络密度。节点数即为站点数,边数为借还次数。网络密度为边的数量占所有可能的连接比例。

c. 画出自行车借还网络图。

e. 计算平均最短路径长度和网络直径

首先选出符合条件(经度位于40.695~40.72,纬度位于- 74.023~-73.973之间)的借车站点和还车站点,并以它们为节点构建一个子图进行分析。然后可以直接使用networkx库中的函数来计算平均最短路径长度和网络直径。

2.2 问题二

  1. 数据预处理:对进行数据清洗和特征提取。可以使用PCA、LDA算法进行降维,减小计算复杂度。

  2. 聚类算法:
    a. K-means: 进行数据聚类时,选择不同的K值进行多次试验,选取最优的聚类结果。可以使用轮廓系数、Calinski-Harabaz指数等评价指标进行比较和选择。
    b. DBSCAN: 利用密度对数据点进行聚类,不需要预先指定聚类的数量。使用基于密度的聚类算法时,可以通过调整半径参数和密度参数来得到不同聚类效果。
    c. 层次聚类:可分为自顶向下和自底向上两种方式。通过迭代计算每个数据点之间的相似度,将数据点逐渐合并,最后得到聚类结果。

    d.改进的聚类算法

    e. 深度聚类算法

  3. 聚类结果分析:选择最优的聚类结果后,对不同类别骑车的用户进行画像。分析每个类别的用户行为特征。

2.3 问题三

  1. 导入数据并进行数据预处理,整合以站点为单位的借车数据。
  2. 对数据进行时间序列分析,使用ARIMA模型进行单日借车量预测。
  3. 使用时间序列交叉验证方法进行模型评估,计算每个站点预测结果的MAPE。
  4. 计算所有站点的MAPE的均值,给出模型的参数数量。

3 Python代码实现

3.1 问题一

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题一Python代码分析

3.2 问题二

【2023 年第二届钉钉杯大学生大数据挑战赛】 初赛 B:美国纽约公共自行车使用量预测分析 问题二Python代码分析

3.3 问题三

(1)合并天气数据


import pandas as pd
import os
# 加载数据
# 合并数据
folder_path = '初赛数据集/问题3数据集'
dfs = []
for filename in os.listdir(folder_path):
    if filename.endswith('.csv'):
        csv_path = os.path.join(folder_path, filename)
        tempdf = pd.read_csv(csv_path)[0:5000]
        dfs.append(tempdf)
bike_data = pd.concat(dfs,axis=0)
weather_data = pd.read_csv('初赛数据集/weather_data_NYC(3).csv')

# 查看数据格式及之间的关联
print(bike_data.head())
print(weather_data.head())

# 将“start time”列和“stop time”列转换为datetime格式
bike_data['starttime'] = pd.to_datetime(bike_data['starttime'])
bike_data['stoptime'] = pd.to_datetime(bike_data['stoptime'])
weather_data['date'] = pd.to_datetime(weather_data['date'])

# 在每张表格中加入一个“day”列,代表日期
bike_data['day'] = bike_data['starttime'].dt.date
weather_data['day'] = weather_data['date'].dt.date

print(bike_data.head())
print(weather_data.head())


(2)特征工程

从两个数据集提取用于建模的特征。

  • 对于公共自行车的使用情况,考虑借车站、还车站、借车时间等。

  • 对于天气条件,还可以考虑温度、湿度、风速等因素。

# 对于公共自行车的使用情况,提取用于建模的特征
bike_data_features = bike_data[['start station id', 'end station id', 'starttime', 'day']]
...# 对天气条件进行处理,提取用于建模的特征
weather_data_features = weather_data[['date', 'temperature', 'humidity', 'wind_speed']]
...# 接下来,需要将两个数据集进行合并,以创建一个数据集来训练模型。我们可以通过将bike_data_features和weather_data_features根据日期(day)合并来实现:

model_data = pd.merge(bike_data_features, weather_data_features, on='day', how='left')
# 类别特征编码
...# 测试集:打标签,计算每天的借车数量
BorrowCounts = model_data.groupby(['day', 'start station id']).size().reset_index()
BorrowCounts = BorrowCounts.rename(columns={
    
    0: 'count'})
model_data = pd.merge(model_data, BorrowCounts, on=['day', 'start station id'], how='left')
...print(model_data.head())

insérez la description de l'image ici

(3)模型训练

回归预测问题,可以采用回归模型,比如XGB、LGB、线性回归、神经网络回归等模型,常用的时间序列预测模型ARIMA模型、GARCH模型、LSTM等。以下是XGB为例。

# 将数据集拆分为训练集和测试集,建立模型并对它进行训练:

import xgboost as xgb
from sklearn.metrics import mean_absolute_percentage_error, mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()


# 拆分数据集
train_data = model_data[model_data['day'] < pd.to_datetime('2015-08-01').date()]
test_data = model_data[model_data['day'] >= pd.to_datetime('2015-08-01').date()]

# 定义输入特征以及输出
data_train = train_data[['start station id', 'end station id', 'starthour', 'is_weekend', 'temperature', 'humidity', 'wind_speed']]
Y_train = train_data['label']


# 测试集:打标签,计算每天的借车数量
data_test = test_data[['start station id', 'end station id', 'starthour', 'is_weekend', 'temperature', 'humidity', 'wind_speed']]
Y_test = test_data['label']

X_train = scaler.fit_transform(data_train)
X_test = scaler.transform(data_test)
# # 定义模型并训练
# XGBoost回归模型,还可以使用线性回归、决策树回归、神经网络回归
model = xgb.XGBRegressor(
            objective='reg:squarederror',
            n_jobs=-1,
            n_estimators=1000,
            max_depth=7,
            subsample=0.8,
            learning_rate=0.05,
            gamma=0,
            colsample_bytree=0.9,
            random_state=2023, max_features=None, alpha=0.3)
model.fit(X_train, Y_train)


insérez la description de l'image ici

(4) 模型评价与检验


# 计算每个站点的MAPE:
# 对测试集进行预测
Y_pred = model.predict(X_test)

def calculate_mape(row):
    return mean_absolute_percentage_error([row['pred']],[row['true']])
# 计算每个站点的MAPE
data_test['pred'] = Y_pred
data_test['y_true'] = Y_test
data_test['mape'] = data_test.apply(calculate_mape, axis=1)
mape_by_station = data_test.groupby('start station id')['mape'].mean()
print(mape_by_station)

insérez la description de l'image ici

# 计算所有站点的MAPE的均值
mape_mean = mean_absolute_percentage_error(Y_test,Y_pred)
print(mape_mean)

0.47444156668192194

# 计算XGB模型的参数数量:
model.get_params()

insérez la description de l'image ici

完整代码

见知乎文章底部链接,下载包括所有问题的全部代码

zhuanlan.zhihu.com/p/643865954

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43935696/article/details/131895347
conseillé
Classement