2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码

目录

  • 问题 1
    • 1.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析
      • 数据探索 -- 单个分类变量的绘图
        • 树形图
        • 条形图
        • 扇形图
        • 雷达图
      • Cramer’s V 相关分析
      • 统计检验
        • 列联表分析
        • 卡方检验
        • Fisher检验
      • 绘图
        • 堆积条形图
        • 分组条形图
      • 分类模型
        • Logistic回归
        • 随机森林

import matplotlib.pyplot as plt
# Linux show Chinese characters *** important
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei' import warnings
warnings.filterwarnings("ignore")
import pandas as pd# read by default 1st sheet of an excel file
path = '/home/shiyu/Desktop/path_acdemic/ant/数模/历年题目/2022/附件.xlsx'
d1 = pd.read_excel(path, sheet_name='表单1')
d2 = pd.read_excel(path, sheet_name='表单2')
d3 = pd.read_excel(path, sheet_name='表单3')print(d1.shape)
print(d2.shape)
print(d3.shape)
(58, 5)
(69, 15)
(8, 16)

问题 1

1.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析

数据探索 – 单个分类变量的绘图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

树形图

https://www.geeksforgeeks.org/treemaps-in-python-using-squarify/

import seaborn as sb 
import matplotlib.pyplot as plt
import squarifydata = list(d1['颜色'].value_counts())
labels = list(d1['颜色'].value_counts().index)plt.rcParams['figure.dpi'] = 300
plt.rcParams['savefig.dpi'] = 300plt.figure(figsize=(15,8))
squarify.plot(sizes=data, label=labels, text_kwargs={'fontsize': 20},color=sb.color_palette("Spectral",len(data))) plt.axis("off") 
(0.0, 100.0, 0.0, 100.0)

在这里插入图片描述

条形图
df = pd.DataFrame(d1['颜色'].value_counts())
df['颜色'] = df.index
df
count颜色
颜色
浅蓝20浅蓝
蓝绿15蓝绿
深绿7深绿
4
浅绿3浅绿
深蓝2深蓝
2
绿1绿
import matplotlib.pyplot as plt
import plotly.express as px
import numpy as np# Linux show Chinese characters *** important
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei' fig = px.bar(df, x="颜色", y="count", title="颜色类别计数")
# center title
fig.update_layout(title_x=0.5)
# remove background color
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
})fig.show()

在这里插入图片描述

扇形图
print(d1['纹饰'].value_counts())
纹饰
C    30
A    22
B     6
Name: count, dtype: int64
import plotly.express as px
fig = px.pie(d1, names='纹饰', title="玻璃纹饰类别的比例分布")
# center title
fig.update_layout(title_x=0.5)
fig.show()

在这里插入图片描述

print(d1['类型'].value_counts())
fig = px.pie(d1, names='类型', title="玻璃类型的比例分布")
# center title
fig.update_layout(title_x=0.5)
fig.show()
类型
铅钡    40
高钾    18
Name: count, dtype: int64

在这里插入图片描述

print(d1['颜色'].value_counts())
fig = px.pie(d1, names='颜色', title="玻璃颜色的比例分布")
# center title
fig.update_layout(title_x=0.5)
fig.show()
颜色
浅蓝    20
蓝绿    15
深绿     7
紫      4
浅绿     3
深蓝     2
黑      2
绿      1
Name: count, dtype: int64

在这里插入图片描述

print(d1['表面风化'].value_counts())
fig = px.pie(d1, names='表面风化', title="表面风化和未风化的比例分布")
# center title
fig.update_layout(title_x=0.5)
fig.show()
表面风化
风化     34
无风化    24
Name: count, dtype: int64

在这里插入图片描述

雷达图

https://plotly.com/python/radar-chart/

df = pd.DataFrame(d1['颜色'].value_counts())
df['颜色'] = df.index
df
count颜色
颜色
浅蓝20浅蓝
蓝绿15蓝绿
深绿7深绿
4
浅绿3浅绿
深蓝2深蓝
2
绿1绿
import plotly.express as px
import pandas as pd
plt.rcParams['figure.dpi'] = 300
plt.rcParams['savefig.dpi'] = 300fig = px.line_polar(df, r='count', theta='颜色', line_close=False,title="颜色各类别计数")
fig.update_traces(fill='toself')
# center title
fig.update_layout(title_x=0.5)
fig.show()

在这里插入图片描述

表面风化 vs 纹饰
在这里插入图片描述

Cramer’s V 相关分析

Cramer’s V: 用于计算名义分类变量之间的相关性。

理论:
https://www.ibm.com/docs/en/cognos-analytics/11.1.0?topic=terms-cramrs-v

代码:
https://www.geeksforgeeks.org/how-to-calculate-cramers-v-in-python/

crosstab = pd.crosstab(d1['表面风化'],d1['纹饰'])# dataframe to numpy
d = crosstab.to_numpy()
d
array([[11,  0, 13],[11,  6, 17]])
import scipy.stats as stats 
import numpy as np X2 = stats.chi2_contingency(d, correction=False)[0] 
N = np.sum(d) 
minimum_dimension = min(d.shape)-1# Calculate Cramer's V 
result = np.sqrt((X2/N) / minimum_dimension) 'Cramer’s V 相关系数 表面风化 vs 纹饰 = ' + str(result)
'Cramer’s V 相关系数 表面风化 vs 纹饰 = 0.29233117579189066'
crosstab = pd.crosstab(d1['表面风化'],d1['类型'])
d = crosstab.to_numpy()X2 = stats.chi2_contingency(d, correction=False)[0] 
N = np.sum(d) 
minimum_dimension = min(d.shape)-1# Calculate Cramer's V 
result = np.sqrt((X2/N) / minimum_dimension) 'Cramer’s V 相关系数 表面风化 vs 类型 = ' + str(result)
'Cramer’s V 相关系数 表面风化 vs 类型 = 0.3444233600968322'
crosstab = pd.crosstab(d1['表面风化'],d1['颜色'])
d = crosstab.to_numpy()X2 = stats.chi2_contingency(d, correction=False)[0] 
N = np.sum(d) 
minimum_dimension = min(d.shape)-1# Calculate Cramer's V 
result = np.sqrt((X2/N) / minimum_dimension) 'Cramer’s V 相关系数 表面风化 vs 颜色 = ' + str(result)
'Cramer’s V 相关系数 表面风化 vs 颜色 = 0.34121631178560535'

统计检验

列联表分析
crosstab = pd.crosstab(d1['表面风化'],d1['纹饰'])
crosstab
纹饰ABC
表面风化
无风化11013
风化11617
卡方检验

https://www.geeksforgeeks.org/python-pearsons-chi-square-test/

import scipy.stats
from scipy.stats import chi2_contingency
# 表面风化 vs 纹饰
crosstab = pd.crosstab(d1['表面风化'],d1['纹饰'])
stat, p, dof, expected = chi2_contingency(crosstab)
# interpret p-value
alpha = 0.05
print("p value is " + str(p))
if p <= alpha:print('Dependent (reject H0)')
else:print('Independent (H0 holds true)')
p value is 0.08388839673210007
Independent (H0 holds true)
# 表面风化 vs 类型
crosstab = pd.crosstab(d1['表面风化'],d1['类型'])
stat, p, dof, expected = chi2_contingency(crosstab)
# interpret p-value
alpha = 0.05
print("p value is " + str(p))
if p <= alpha:print('Dependent (reject H0)')
else:print('Independent (H0 holds true)')
p value is 0.019548014331003307
Dependent (reject H0)
# 表面风化 vs 颜色
crosstab = pd.crosstab(d1['表面风化'],d1['颜色'])
stat, p, dof, expected = chi2_contingency(crosstab)
# interpret p-value
alpha = 0.05
print("p value is " + str(p))
if p <= alpha:print('Dependent (reject H0)')
else:print('Independent (H0 holds true)')
p value is 0.5066496855976865
Independent (H0 holds true)
Fisher检验
pd.crosstab(d1['表面风化'],d1['颜色'])
颜色浅绿浅蓝深绿深蓝绿蓝绿
表面风化
无风化28322160
风化112402092
import FisherExact as fsprint('表面风化 vs 颜色')
print(fs.fisher_exact(pd.crosstab(d1['表面风化'],d1['颜色'])))
表面风化 vs 颜色
0.0

绘图

堆积条形图

表面风化 vs 纹饰

crosstab = pd.crosstab(d1['表面风化'],d1['纹饰'])
crosstab
纹饰ABC
表面风化
无风化11013
风化11617
dp = [['无风化', '纹饰A', 11], ['无风化', '纹饰B', 0],['无风化', '纹饰C', 13],['风化', '纹饰A', 11],['风化', '纹饰B', 6],['风化', '纹饰C', 17]]# Create the pandas DataFrame
df = pd.DataFrame(dp, columns=['表面风化', '纹饰', '计数'])
df
表面风化纹饰计数
0无风化纹饰A11
1无风化纹饰B0
2无风化纹饰C13
3风化纹饰A11
4风化纹饰B6
5风化纹饰C17
import matplotlib.pyplot as plt
import plotly.express as px
import numpy as np# Linux show Chinese characters *** important
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei' fig = px.bar(df, x="表面风化", y="计数", color="纹饰", title="表面风化与纹饰的关系")
# center title
fig.update_layout(title_x=0.5)
# remove background color
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
})fig.show()

在这里插入图片描述

表面风化 vs 玻璃类型

crosstab = pd.crosstab(d1['表面风化'],d1['类型'])
crosstab
类型铅钡高钾
表面风化
无风化1212
风化286
dp = [['无风化', '铅钡', 12], ['无风化', '高钾', 12],['风化', '铅钡', 28],['风化', '高钾', 6]]# Create the pandas DataFrame
df = pd.DataFrame(dp, columns=['表面风化', '玻璃类型', '计数'])
df
表面风化玻璃类型计数
0无风化铅钡12
1无风化高钾12
2风化铅钡28
3风化高钾6
fig = px.bar(df, x="表面风化", y="计数", color="玻璃类型", title="表面风化与玻璃类型的关系")
# center title
fig.update_layout(title_x=0.5)
# remove background color
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
})fig.show()

在这里插入图片描述

表面风化 vs 颜色

crosstab = pd.crosstab(d1['表面风化'],d1['颜色'])
crosstab
颜色浅绿浅蓝深绿深蓝绿蓝绿
表面风化
无风化28322160
风化112402092
col1 = pd.DataFrame(['无风化'] * crosstab.shape[1] + ['风化'] * crosstab.shape[1])
col2 = pd.DataFrame(list(crosstab.columns) * 2)
col3 = pd.DataFrame(list(crosstab.iloc[0]) + list(crosstab.iloc[1]))df = pd.concat([col1, col2, col3], axis=1)
df.columns = ['表面风化', '颜色', '计数']
df
表面风化颜色计数
0无风化浅绿2
1无风化浅蓝8
2无风化深绿3
3无风化深蓝2
4无风化2
5无风化绿1
6无风化蓝绿6
7无风化0
8风化浅绿1
9风化浅蓝12
10风化深绿4
11风化深蓝0
12风化2
13风化绿0
14风化蓝绿9
15风化2
fig = px.bar(df, x="表面风化", y="计数", color="颜色", title="表面风化与颜色的关系")
# center title
fig.update_layout(title_x=0.5)
# remove background color
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
})fig.show()

在这里插入图片描述

分组条形图
fig = px.bar(df, x="表面风化", y="计数", color="颜色", title="表面风化与颜色的关系", barmode='group')
# center title
fig.update_layout(title_x=0.5)
# remove background color
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
})fig.show()

在这里插入图片描述

分类模型

Logistic回归

https://www.w3schools.com/python/python_ml_logistic_regression.asp

import sklearn
import warnings 
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn import linear_modeld1['颜色'].fillna('浅蓝', inplace=True)
df = d1.iloc[:,1:5]
# data encode
label_encoder = LabelEncoder()
df_encode = df.select_dtypes(include=['object']).apply(label_encoder.fit_transform)
df_encode.head()
纹饰类型颜色表面风化
02160
10011
20160
30160
40160
X = df_encode.drop('表面风化', axis=1)
y = df_encode['表面风化']logr = linear_model.LogisticRegression()
logr.fit(X,y)print('截距项 = ' + str(logr.intercept_))log_odds = logr.coef_
odds = numpy.exp(log_odds)
print('回归系数= ' + str(odds))
截距项 = [0.20030893]
回归系数= [[1.12409879 0.24081195 1.1795666 ]]
随机森林
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
#import shap
from sklearn.metrics import accuracy_score
import numpy as np
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X, y)importances = clf.feature_importances_
feature_imp_df = pd.DataFrame({'变量名': X.columns, '重要性程度': importances}).sort_values('重要性程度', ascending=True) 
feature_imp_df
变量名重要性程度
0纹饰0.270358
1类型0.297645
2颜色0.431998
import matplotlib.pyplot as plt
import plotly.express as px
import numpy as np# Linux show Chinese characters *** important
plt.rcParams['font.family'] = 'WenQuanYi Micro Hei' fig = px.bar(feature_imp_df, y="变量名", x="重要性程度",title="表面风化与其玻璃类型、纹饰和颜色的关系强度", orientation='h')
# center title
fig.update_layout(title_x=0.5)
# remove background color
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
})fig.show()

在这里插入图片描述
相关阅读:

  • 2022高教社杯全国大学生数学建模竞赛C题 问题一(2) Python代码
  • 2022高教社杯全国大学生数学建模竞赛C题 问题一(3) Python代码
  • 2023高教社杯全国大学生数学建模竞赛C题 Python代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/425787.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在STM32工程中使用Mavlink与飞控通信

本文讲述如何在STM32工程中使用Mavlink协议与飞控通信&#xff0c;特别适合自制飞控外设模块的项目。 需求来源&#xff1a; 1、增稳云台里的STM32单片机需要通过串口接收飞控传来的云台俯仰、横滚控制指令和相机拍照控制指令&#xff1b; 2、自制的有害气体采集器需要接收飞…

[Python可视化]数据可视化在医疗领域应用:提高诊断准确性和治疗效果

随着医疗数据的增长&#xff0c;如何从庞大的数据集中快速提取出有用的信息&#xff0c;成为了医疗研究和实践中的一大挑战。数据可视化在这一过程中扮演了至关重要的角色&#xff0c;它能够通过图形的方式直观展现复杂的数据关系&#xff0c;从而帮助医生和研究人员做出更好的…

专题四_位运算( >> , << , , | , ^ )_算法详细总结

目录 位运算 常见位运算总结 1.基础位运算 2.给一个数 n ,确定它的二进制表示中的第 x 位是 0 还是 1 3.运算符的优先级 4.将一个数 n 的二进制表示的第 x 位修改成 1 5.将一个数n的二进制表示的第x位修改成0 6.位图的思想 7.提取一个数&#xff08;n&#xff09;二进…

【嘉立创EDA】画PCB板中为什么要两面铺铜为GND,不能一面GND一面VCC吗?

在新手画板子铺铜时&#xff0c;经常会铺一面GND一面VCC。但一般情况下我们不会这样铺铜。下面将详细分析为什么要两面铺铜为GND&#xff0c;而不是一面GND一面VCC的原因&#xff1a; 提高散热能力 金属导热性&#xff1a;金属具有良好的导热性&#xff0c;铺铜可以有效分散PCB…

引用和指针的区别(面试概念性题型)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 内存占用&#xff1a; 引用&#xff1a;引用一个变量时&#xff0c;实际上并…

2024 年浙江省网络安全行业网络安全运维工程师项目 职业技能竞赛网络安全运维工程师(决赛样题)

2024年浙江省网络安全行业网络安全运维工程师项目 职业技能竞赛网络安全运维工程师&#xff08;决赛样题&#xff09; 应急响应&#xff1a;1 通过流量分析&#xff0c;找到攻击者的 IP 地址2 找到攻击者下载的恶意文件的 32 位小写 md5 值3 找到攻击者登录后台的 URI4 找到攻击…

攻防世界--->hackme

学习笔记。 下载 查壳。 64ida打开。 进入main&#xff1a; 跟进&#xff1a; 这是密文 咋一看这程序感觉很复杂&#xff0c;很复杂&#xff1a; 脚本&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h>int main() {unsigned char …

【数据结构】线段树复杂应用

1.线段树离散化 逆序对 1.1逆序对 题目描述 猫猫 TOM 和小老鼠 JERRY 最近又较量上了&#xff0c;但是毕竟都是成年人&#xff0c;他们已经不喜欢再玩那种你追我赶的游戏&#xff0c;现在他们喜欢玩统计。 最近&#xff0c;TOM 老猫查阅到一个人类称之为“逆序对”的东西&…

小程序开发设计-第一个小程序:创建小程序项目④

上一篇文章导航&#xff1a; 小程序开发设计-第一个小程序&#xff1a;安装开发者工具③-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219152?spm1001.2014.3001.5501 须知&#xff1a;注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 一、创…

5G Multicast/Broadcast Services(MBS) (二) Multicast

这篇是Multicast handling的overview,正文开始。 值得注意的是,对于5MBS multicast,UE只有处于RRC connected和Inactive时,网络侧才可以通过MRB将MBS multicast数据传输到 UE;处于Idle态只能进行MBS broadcast过程。 对于multicast涉及的RNTI有G-RNTI,G-CS-RNTI以及在RRC …

2022高教社杯全国大学生数学建模竞赛C题 问题二(1) Python代码

目录 问题 22.1 依据附件数据分析高钾玻璃、铅钡玻璃的分类规律数据类别编码不平衡数据处理分类模型决策树分类随机森林分类XGBoost分类LightGBM分类Catboost分类基于直方图的梯度提升Histogram-Based Gradient Boosting梯度提升树Gradient Boosting Tree逻辑回归Logistic朴素贝…

在linux用docker部署MySQL失败

Unable to find image mysql:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 128.121.243.107:443: i/o timeout. See docker run --help. 从网上找解决问题一直说是镜像问题&#xff0c;我原来的镜像是从自…

vue之我不会

一、计算属性 例子&#xff1a; 注意&#xff1a;调用计算属性时&#xff0c;不可以带括号&#xff0c;那样调用的就是方法&#xff0c;如&#xff1a;以下调用fullName时不可funnName() <div id"root">姓&#xff1a;<input type"text" v-model&…

spring ai整合ollama anythingllm

Windows安装ollama和AnythingLLM 下载安装包 下载上面的安装包ollama&AnythingLLM.zip 解压如下 安装ollama 双击OllamaSetup.exe安装即可&#xff0c;安装完成后再命令行查看 ollama --version 即安装成功 运行模型 常用的模型如下 我们选择常用的llama2 ollama r…

【Hot100】LeetCode—84. 柱状图中最大的矩形

目录 1- 思路题目识别单调栈 2- 实现⭐84. 柱状图中最大的矩形——题解思路 3- ACM 实现 原题链接&#xff1a;84. 柱状图中最大的矩形 1- 思路 题目识别 识别1 &#xff1a;给定一个数组 heights &#xff0c;求解柱状图的最大面积 单调栈 使用 Stack 来实现&#xff0c;遍…

wireshark打开时空白|没有接口,卸载重装可以解决

解决方法&#xff1a;卸载wireshark,全选卸载干净&#xff0c;重新安装旧版的wireshark4.2.7, 甚至cmd下运行net start npf时显示服务名无效&#xff0c;但打开wireshark仍有多个接口 错误描述&#xff1a; 一开始下载的是wireshark的最新版&#xff0c;win11 x64 在安装wir…

F28335 时钟及控制系统

1 F28335 系统时钟来源 1.1 振荡器OSC与锁相环PLL 时钟信号对于DSP来说是非常重要的,它为DSP工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。DSP 属于数字信号处理器, 它正常工作也必须为其提供时钟信号。那么这个时钟…

几种mfc140u.dll常见错误情况,以及mfc140u.dll文件修复的方法

如果你遇到与mfc140u.dll 文件相关的错误&#xff0c;这通常指的是该mfc140u.dll文件可能丢失、损坏或与您的应用程序不兼容。详细分析关于mfc140u.dll文件错误会对系统有什么影响&#xff0c;mfc140u.dll文件处于什么样的位置&#xff1f;以下是几种常见的错误情况及其修复方法…

Chrome谷歌浏览器登录账号next无反应

文章目录 问题描述 我们的Chrome浏览器在更新之后&#xff0c;会出现登录谷歌账号的时候&#xff0c;当你输入你的谷歌邮箱之后&#xff0c;点击 n e x t next next,也就是下一步的时候&#xff0c;页面没有反应&#xff0c;也就是没有跳转到输入密码的页面。 分析 根据logs里…

vue3 透传 Attributes

前言 Vue 3 现在正式支持了多根节点的组件&#xff0c;也就是片段&#xff01; Vue 2.x 遵循单根节点组件的规则&#xff0c;即一个组件的模板必须有且仅有一个根元素。 为了满足单根节点的要求&#xff0c;开发者会将原本多根节点的内容包裹在一个<div>元素中&#x…