2023 선전 컵 수학적 모델링 아이디어 - 검토: 캠퍼스 소비자 행동 분석

0 경쟁 아이디어

(경쟁 질문이 나오는 즉시 CSDN에 공유)

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

1 주제의 배경

캠퍼스카드는 신원인증, 금융소비, 데이터 공유 등 여러 기능을 통합한 정보통합시스템이다. 교사와 학생에게 고품질의 효율적인 정보 서비스를 제공하는 한편, 시스템 자체에는 학생의 소비행태, 매점 등 각 부서의 운영현황 등의 정보가 포함된 많은 이력이 축적되어 있다.

2016년 1월 27일자 "Yangtze Evening News" 보도: "Southern Institute of Technology, 가난한 학생들에게 따뜻한 식사 제공" 카드 보조금"".

신청할 필요도없고 검토도없고 식사 카드에 조용히 수백 위안을 추가 할 수 있습니다 ... 기자는 어제 난징 공과 대학에서 독점적으로 난징 공과 대학 교육 재단이 공식적으로 "심장 - 온난화 식사 카드"

이 프로젝트는 극도로 가난한 학생들의 음식과 의복 문제에 대해 "정밀 지원"을 제공합니다.

이 프로젝트는 빈곤한 학부생의 "음식과 의복 문제"에 대해 특별히 지원을 제공합니다. 교육재단 관계자는 학교카드센터에서 9월 중순부터 11월 중순까지 교내 학부생 1만6000여명의 카드 도용 기록을 찾아내고 전 기록을 빅데이터 분석했다. 결국 500개가 넘는 '준보조물'이 선정됐다.

South Technological Education Foundation은 100만 위안의 "종자 기금"을 창업 자본으로 취하고 각 가난한 학생의 다양한 상황에 따라 특정 보조금 금액을 결정한 다음 "조용히" 돈을 학생의 식사 카드 , 어려움이 있는 학생들이 충분한 음식을 먹을 수 있도록 합니다.

——"양쯔 저녁 뉴스" 2016년 1월 27일: NIT는 가난한 학생들에게 "따뜻한 식권 보조금"을 제공합니다. 이 질문은 국내 대학의 캠퍼스 카드 시스템의 한 달간 운영 데이터를 제공합니다. 참가자는 그것을 사용할 것으로 예상됩니다.

데이터 분석 및 모델링 방법, 데이터에 포함된 정보 마이닝, 교내 학생의 학습 및 생활 행동 분석, 학교 서비스 개선 및 유관 부서의 의사 결정을 위한 정보 지원 제공.

2 분석 목적

  • 1. 학생들의 소비 행태와 매점 운영 실태를 분석하고 매점 운영을 위한 제안을 한다.

  • 2. 학생 소비 세분화 모델을 구축하여 학교가 학생의 경제 상태를 판단하는 데 참고할 수 있도록 합니다.

3 데이터 설명

첨부파일은 2019년 4월 1일부터 2019년 4월 30일까지 학교의 원카드 데이터입니다.

총 3개의 파일이 있습니다: data1.csv, data2.csv, data3.csv
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

4 데이터 전처리

첨부파일에 있는 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 학생 소비 행태 분석

학생들의 전체 교내 소비 데이터에 따라 이번 달 1인당 카드 스와이프 횟수와 1인당 소비량을 산출하고, 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()

여기에 이미지 설명 삽입

Supongo que te gusta

Origin blog.csdn.net/dc_sinor/article/details/131854255
Recomendado
Clasificación