2023 深セン杯の数学モデリングのアイデア - レビュー: キャンパスの消費者行動の分析

コンテストのアイデアが 0 件あります

(コンテストの質問が出たらすぐに CSDN で共有します)

https://blog.csdn.net/dc_sinor?type=blog

1 トピックの背景

キャンパスカードは、本人認証、金銭消費、データ共有などの複数の機能を統合した情報統合システムです。教職員や生徒に質の高い効率的な情報サービスを提供するとともに、システム自体にも生徒の消費行動や学食など各部門の運営状況などの情報を多数の履歴として蓄積してきました。

2016年1月27日の「長江晩報」の報道「南工科大学、貧しい学生に心温まる食事を提供」など、多くの大学がキャンパスカードシステムに基づく「スマートキャンパス」の関連構築を実施している。カード補助金」。

申請も審査も必要なく、数百元を静かにミールカードに追加することができます...記者は昨日、南京理工大学からのみ知りました、南京理工大学教育財団が正式に「心心」を立ち上げたことを知りました。あったかミールカード』

このプロジェクトは、極度に貧しい学生の衣食問題に対する「的確な支援」を提供するもの。

このプロジェクトは、特に貧しい学部生の「衣食問題」を支援するものです。教育財団のスタッフはスクールカードセンターで、9月中旬から11月中旬にかけて同校の学部生1万6000人以上のカードスワイプ記録を発見し、すべての記録のビッグデータ分析を実施した。最終的に500件以上の「準支援対象」が選定された。

南方技術教育財団は、設立資金として100万元の「シード資金」を引き出し、貧しい学生それぞれの異なる状況に応じて具体的な補助金額を決定し、その資金を学生の資金に「静かに」投入する。ミールカードは、困難を抱えた学生が十分な食事を確保できるようにするためのものです。

——「長江晩​​報」2016年1月27日:NIT、貧困学生に「心温まるミールカード補助金」 この質問は、国内大学のキャンパスカードシステムの1か月分の運用データを提供するものであり、参加者はそれを利用することが期待される

データ分析とモデリング、データに含まれる情報のマイニング、キャンパス内での学生の学習と生活行動の分析、学校サービスの向上と関連部門の意思決定のための情報サポートを提供する方法。

2 分析の目的

  • 1. 学生の消費行動や学食の運営状況を分析し、学食の運営に関する提案を行う。

  • 2. 学校が生徒の経済的状況を判断するための参考となる、生徒の消費セグメンテーション モデルを構築します。

3 データの説明

添付ファイルは2019年4月1日から2019年4月30日までの学校の1枚データです

合計 3 つのファイルがあります: data1.csv、data2.csv、data3.csv
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

4 データの前処理

添付ファイルの 3 つのファイル data1.csv、data2.csv、および data3.csv を分析環境にロードし、付録 1 を参照してフィールドの意味を理解します。データの品質を調査し、欠損値や外れ値などに対して必要な処理を行います。処理結果を「task1_1_X.csv」として保存し(複数のデータテーブルが含まれる場合は、Xに1から次までの番号を付けることができます)、レポートに処理過程を記述します。

import numpy as np
import pandas as pd
import os
os.chdir('/home/kesci/input/2019B1631')
data1 = pd.read_csv("data1.csv", encoding="gbk")
data2 = pd.read_csv("data2.csv", encoding="gbk")
data3 = pd.read_csv("data3.csv", encoding="gbk")
data1.head(3)

ここに画像の説明を挿入

data1.columns = ['序号', '校园卡号', '性别', '专业名称', '门禁卡号']
data1.dtypes

ここに画像の説明を挿入

data1.to_csv('/home/kesci/work/output/2019B/task1_1_1.csv', index=False, encoding='gbk')
data2.head(3)

ここに画像の説明を挿入
data1.csv の生徒の個人情報と data2.csv の消費記録を関連付けて処理結果を「task1_2_1.csv」として保存し、 data1.csv の生徒の個人情報と data3.csv のアクセス制御レコードを関連付け、処理結果は「task1_2_2.csv」として保存されます。

data1 = pd.read_csv("/home/kesci/work/output/2019B/task1_1_1.csv", encoding="gbk")
data2 = pd.read_csv("/home/kesci/work/output/2019B/task1_1_2.csv", encoding="gbk")
data3 = pd.read_csv("/home/kesci/work/output/2019B/task1_1_3.csv", encoding="gbk")
data1.head(3)

ここに画像の説明を挿入

5 データ分析

5.1 食堂での食事行動の分析

各食堂で食事をする人数の割合を円グラフに描き、朝食、昼食、夕食を食べる場所で大きな違いがあるかどうかを分析し、レポートに記載します。(ヒント: 非常に近い間隔での複数のクレジット カードのスワイプ記録は、食事行動である可能性があります)

data = pd.read_csv('/home/kesci/work/output/2019B/task1_2_1.csv', encoding='gbk')
data.head()

ここに画像の説明を挿入

import matplotlib as mpl
import matplotlib.pyplot as plt
# notebook嵌入图片
%matplotlib inline
# 提高分辨率
%config InlineBackend.figure_format='retina'
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="/home/kesci/work/SimHei.ttf")
import warnings
warnings.filterwarnings('ignore')
canteen1 = data['消费地点'].apply(str).str.contains('第一食堂').sum()
canteen2 = data['消费地点'].apply(str).str.contains('第二食堂').sum()
canteen3 = data['消费地点'].apply(str).str.contains('第三食堂').sum()
canteen4 = data['消费地点'].apply(str).str.contains('第四食堂').sum()
canteen5 = data['消费地点'].apply(str).str.contains('第五食堂').sum()
# 绘制饼图
canteen_name = ['食堂1', '食堂2', '食堂3', '食堂4', '食堂5']
man_count = [canteen1,canteen2,canteen3,canteen4,canteen5]
# 创建画布
plt.figure(figsize=(10, 6), dpi=50)
# 绘制饼图
plt.pie(man_count, labels=canteen_name, autopct='%1.2f%%', shadow=False, startangle=90, textprops={'fontproperties':font})
# 显示图例
plt.legend(prop=font)
# 添加标题
plt.title("食堂就餐人次占比饼图", fontproperties=font)
# 饼图保持圆形
plt.axis('equal')
# 显示图像
plt.show()

ここに画像の説明を挿入
カフェテリアでのカードスワイプ記録を通じて、営業日と非営業日のカフェテリアの食事時間曲線をそれぞれ描き、カフェテリアの朝食、昼食、夕食の食事ピークを分析し、レポートに記載します。

ここに画像の説明を挿入

# 对data中消费时间数据进行时间格式转换,转换后可作运算,coerce将无效解析设置为NaT
data.loc[:,'消费时间'] = pd.to_datetime(data.loc[:,'消费时间'],format='%Y-%m-%d %H:%M',errors='coerce')
data.dtypes
# 创建一个消费星期列,根据消费时间计算出消费时间是星期几,Monday=1, Sunday=7
data['消费星期'] = data['消费时间'].dt.dayofweek + 1
data.head(3)
# 以周一至周五作为工作日,周六日作为非工作日,拆分为两组数据
work_day_query = data.loc[:,'消费星期'] <= 5
unwork_day_query = data.loc[:,'消费星期'] > 5

work_day_data = data.loc[work_day_query,:]
unwork_day_data = data.loc[unwork_day_query,:]
# 计算工作日消费时间对应的各时间的消费次数
work_day_times = []
for i in range(24):
    work_day_times.append(work_day_data['消费时间'].apply(str).str.contains(' {:02d}:'.format(i)).sum())
    # 以时间段作为x轴,同一时间段出现的次数和作为y轴,作曲线图
x = []
for i in range(24):
    x.append('{:02d}:00'.format(i))
# 绘图
plt.plot(x, work_day_times, label='工作日')
# x,y轴标签
plt.xlabel('时间', fontproperties=font);
plt.ylabel('次数', fontproperties=font)
# 标题
plt.title('工作日消费曲线图', fontproperties=font)
# x轴倾斜60度
plt.xticks(rotation=60)
# 显示label
plt.legend(prop=font)
# 加网格
plt.grid()

ここに画像の説明を挿入

# 计算飞工作日消费时间对应的各时间的消费次数
unwork_day_times = []
for i in range(24):
    unwork_day_times.append(unwork_day_data['消费时间'].apply(str).str.contains(' {:02d}:'.format(i)).sum())
    # 以时间段作为x轴,同一时间段出现的次数和作为y轴,作曲线图
x = []
for i in range(24): 
    x.append('{:02d}:00'.format(i))
plt.plot(x, unwork_day_times, label='非工作日')
plt.xlabel('时间', fontproperties=font);
plt.ylabel('次数', fontproperties=font)
plt.title('非工作日消费曲线图', fontproperties=font)
plt.xticks(rotation=60)
plt.legend(prop=font)
plt.grid()

ここに画像の説明を挿入
上記の分析結果から、ピーク時間をずらすなどの食堂運営の提案が容易になります。

5.2 学生の消費行動の分析

学生のキャンパス全体の消費データに基づいて、今月は一人当たりのカードスワイプ頻度と一人当たりの消費額が計算され、3つの専攻が選択され、異なる専攻の異なる性別の学生の消費特性が分析されます。

data = pd.read_csv('/home/kesci/work/output/2019B/task1_2_1.csv', encoding='gbk')
data.head()

ここに画像の説明を挿入

# 计算人均刷卡频次(总刷卡次数/学生总人数)
cost_count = data['消费时间'].count()
student_count = data['校园卡号'].value_counts(dropna=False).count()
average_cost_count = int(round(cost_count / student_count))
average_cost_count


# 计算人均消费额(总消费金额/学生总人数)
cost_sum = data['消费金额'].sum()
average_cost_money = int(round(cost_sum / student_count))
average_cost_money


# 选择消费次数最多的3个专业进行分析
data['专业名称'].value_counts(dropna=False)

ここに画像の説明を挿入

# 消费次数最多的3个专业为 连锁经营、机械制造、会计
major1 = data['专业名称'].apply(str).str.contains('18连锁经营')
major2 = data['专业名称'].apply(str).str.contains('18机械制造')
major3 = data['专业名称'].apply(str).str.contains('18会计')
major4 = data['专业名称'].apply(str).str.contains('18机械制造(学徒)')

data_new = data[(major1 | major2 | major3) ^ major4]
data_new['专业名称'].value_counts(dropna=False)


 分析 每个专业,不同性别 的学生消费特点
data_male = data_new[data_new['性别'] == '男']
data_female = data_new[data_new['性别'] == '女']
data_female.head()

ここに画像の説明を挿入
学生のキャンパス全体の消費行動に応じて、適切な特徴を選択し、クラスタリング モデルを構築し、各タイプの学生グループの消費特性を分析します。

data['专业名称'].value_counts(dropna=False).count()
# 选择特征:性别、总消费金额、总消费次数
data_1 = data[['校园卡号','性别']].drop_duplicates().reset_index(drop=True)
data_1['性别'] = data_1['性别'].astype(str).replace(({'男': 1, '女': 0}))
data_1.set_index(['校园卡号'], inplace=True)
data_2 = data.groupby('校园卡号').sum()[['消费金额']]
data_2.columns = ['总消费金额']
data_3 = data.groupby('校园卡号').count()[['消费时间']]
data_3.columns = ['总消费次数']
data_123 =  pd.concat([data_1, data_2, data_3], axis=1)#.reset_index(drop=True)
data_123.head()

# 构建聚类模型
from sklearn.cluster import KMeans
# k为聚类类别,iteration为聚类最大循环次数,data_zs为标准化后的数据
k = 3    # 分成几类可以在此处调整
iteration = 500
data_zs = 1.0 * (data_123 - data_123.mean()) / data_123.std()
# n_jobs为并发数
model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration, random_state=1234)
model.fit(data_zs)
# r1统计各个类别的数目,r2找出聚类中心
r1 = pd.Series(model.labels_).value_counts()
r2 = pd.DataFrame(model.cluster_centers_)
r = pd.concat([r2,r1], axis=1)
r.columns = list(data_123.columns) + ['类别数目']


# 选出消费总额最低的500名学生的消费信息
data_500 = data.groupby('校园卡号').sum()[['消费金额']]
data_500.sort_values(by=['消费金额'],ascending=True,inplace=True,na_position='first')
data_500 = data_500.head(500)
data_500_index = data_500.index.values
data_500 = data[data['校园卡号'].isin(data_500_index)]
data_500.head(10)

ここに画像の説明を挿入

# 绘制饼图
canteen_name = list(data_max_place.index)
man_count = list(data_max_place.values)
# 创建画布
plt.figure(figsize=(10, 6), dpi=50)
# 绘制饼图
plt.pie(man_count, labels=canteen_name, autopct='%1.2f%%', shadow=False, startangle=90, textprops={'fontproperties':font})
# 显示图例
plt.legend(prop=font)
# 添加标题
plt.title("低消费学生常消费地点占比饼图", fontproperties=font)
# 饼图保持圆形
plt.axis('equal')
# 显示图像
plt.show()

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/dc_sinor/article/details/131854255