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

2023 2e DingTalk Cup College Student Big Data Challenge Tour préliminaire B : Prédiction et analyse de l'utilisation des vélos publics Question 2 à 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 Type 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) En 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. Algorithme de clustering :
    A. K-means : lors de la mise en cluster des données, sélectionnez différentes valeurs K pour plusieurs expériences et sélectionnez le résultat de clustering optimal. Des indicateurs d'évaluation tels que le coefficient de silhouette et l'indice de Calinski-Harabaz peuvent être utilisés pour la comparaison et la sélection.
    b. DBSCAN : utilisez la densité pour regrouper les points de données sans spécifier le nombre de grappes à l'avance. Lors de l'utilisation d'un algorithme de regroupement basé sur la densité, différents effets de regroupement peuvent être obtenus en ajustant le paramètre de rayon et le paramètre de densité.
    c. Regroupement hiérarchique : peut être divisé en méthodes descendantes et ascendantes. En calculant itérativement la similarité entre chaque point de données, les points de données sont progressivement fusionnés, et finalement le résultat de regroupement est obtenu.

    d. Algorithme de clustering amélioré

    E. Algorithme de clustering profond

  3. Analyse des résultats de clustering : Après avoir sélectionné le résultat de clustering optimal, faites des portraits des différentes catégories d'utilisateurs de vélo. Analysez les caractéristiques de comportement des utilisateurs pour chaque catégorie.

2.3 Questions 3

  1. Importez des données et effectuez un prétraitement des données, et intégrez les données de location de voitures site par site.
  2. Effectuez une analyse de séries chronologiques sur les données et utilisez le modèle ARIMA pour prédire le nombre de véhicules empruntés en une seule journée.
  3. L'évaluation du modèle a été effectuée à l'aide d'une méthode de validation croisée de séries chronologiques pour calculer le MAPE pour les résultats des prévisions de chaque site.
  4. Calcule la moyenne du MAPE pour tous les sites, compte tenu du nombre de paramètres du modèle.

3 Implémentation du code Python

3.1 Questions 1

[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

3.2 Question 2

3.2.1 Lire les données

importer un paquet

import pandas as pd
from sklearn.cluster import Birch
from sklearn.cluster import AgglomerativeClustering
from sklearn.decomposition import PCA
import time
from sklearn import metrics
import os
from sklearn.cluster import MeanShift
from tqdm import tqdm
import numpy as np
import warnings
warnings.filterwarnings("ignore")
tqdm.pandas()

# 合并数据
folder_path = '初赛数据集/2013_2015'
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)
        dfs.append(tempdf)
data = pd.concat(dfs,axis=0)

# 根据数据表的字段说明,删除与研究无关的列,例如自行车编号和出生年份等信息,并在必要时删除带有缺失值的行。
data.drop(['bikeid', 'birth year'], axis=1, inplace=True)
data.dropna(inplace=True)    # 删除带有缺失值的行
data.shape

3.2.3 Ingénierie des fonctionnalités

Créez de nouvelles fonctionnalités, notamment : la différence entre l'heure de départ et l'heure de fin, et la distance entre les stations de départ et d'arrivée (calculée par la latitude et la longitude), etc.


from math import radians, sin, cos, acos
from datetime import datetime

data['starttime'] = pd.to_datetime(data['starttime'])  # 将时间格式转换为datetime
data['stoptime'] = pd.to_datetime(data['stoptime'])
# 计算时间差值和路程距离
data['duration'] = data['stoptime'] - data['starttime']
data['duration'] = data['duration'] / pd.Timedelta(seconds=1)  # 将时间差值转换为秒数


def get_distance(lat1, lng1, lat2, lng2):
    """
    根据两点经纬度计算路程距离,单位为米
    """
   。。。略
    return distance * 1000
data['distance'] = data.apply(
    lambda row: get_distance(row['start station latitude'], row['start station longitude'], 
                             row['end station latitude'], row['end station longitude']), axis=1)

features = ['tripduration', 'start station latitude', 'start station longitude', 
            'end station latitude', 'end station longitude', 'duration', 'distance']

clear_data =data[features]
clear_data.to_excel('初赛数据集/特征工程后的数据.xlsx',index=False)

3.2.3 Analyse groupée

Analyse de la valeur K, en utilisant la méthode du coude



start = time.time()
trainingData = weight
SSE = []  # 存放每次结果的误差平方和
k1 = 2
k2 = 10
trainingData =weight 
for k in range(k1, k2):
    estimator = KMeans(n_clusters=k, max_iter=10000, init="k-means++", tol=1e-6)
    estimator.fit(trainingData)
    SSE.append(estimator.inertia_) # estimator.inertia_获取聚类准则的总和
end = time.time()
print(f'耗时:{
      
      end-start}s')
X = range(k1,k2)
plt.figure(figsize=(8,6))
plt.xlabel('k',fontsize=20)
plt.ylabel('SSE',fontsize=20)
plt.plot(X, SSE, 'o-')
plt.savefig('img/手肘法.png',dpi=300)
plt.show()

3.2.4 Regroupement Kmeas

from sklearn.cluster import KMeans
start = time.time()

trainingData = weight
clf = KMeans(n_clusters=4,max_iter=10000, init="k-means++", tol=1e-6)
result = clf.fit(trainingData)
source = list(clf.predict(trainingData))
end = time.time()
label = clf.labels_
print(f'耗时:{
      
      end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)

import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure(figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/kmeans.png',dpi=300)
plt.show()

insérez la description de l'image ici

3.2.5 Regroupement hiérarchique AGG

start = time.time()
trainingData = weight
# 使用层次聚类
clf = AgglomerativeClustering(n_clusters=4, linkage='ward', affinity='euclidean')
result = clf.fit(trainingData)
source = list(clf.labels_)
end = time.time()
label = clf.labels_
print(f'耗时:{
      
      end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)

import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure(figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/agg聚类.png',dpi=300)
plt.show()

3.2.6 Regroupement DBSCAN

from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA
import time
from sklearn import metrics
start = time.time()
trainingData = weight
clf = DBSCAN(eps=0.08, min_samples=7)
result = clf.fit(trainingData)
source = list(clf.fit_predict(trainingData))
end = time.time()
label = clf.labels_

print(f'耗时:{
      
      end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)

import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure (figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/dbscan.png',dpi=300)
plt.show()

insérez la description de l'image ici

3.2.7 Groupement du bouleau

trainingData = weight
clf = Birch(n_clusters=5, branching_factor=10, threshold=0.01)
start = time.time()
result = clf.fit(trainingData)
source = list(clf.predict(trainingData))
end = time.time()
label = clf.labels_
print(f'耗时:{
      
      end-start}s')
silhouette = metrics.silhouette_score(trainingData, label)
print("silhouette: ", silhouette)
import matplotlib.pyplot as plt
import seaborn as sns
# 使用PCA将样本点投影到二维平面上
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(weight)
source = list(clf.predict(trainingData))
# 绘制每个样本点与其对应的簇标签
plt.figure(figsize=(8, 6))
sns.scatterplot(x=reduced_data[:, 0], y=reduced_data[:, 1], hue=source, palette='bright')
plt.savefig('img/Birch聚类.png',dpi=300)
plt.show()

4 Téléchargement complet du code

Voir le lien en bas de l'article, comprenant tous les codes de toutes les questions

zhuanlan.zhihu.com/p/643865954

Je suppose que tu aimes

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