卡方
需求
给定excel文件,读取文件内的几列数据,获取几列数据之间的卡方值。
步骤与代码
- 准备
引入包,设置文件名
name = 'data.xlsx'
import numpy as np
from scipy.stats import chi2_contingency
import pandas as pd
- 按列读取数据,并将类别转化为数字
def get_data():
"""
获得数据,并转成数字形式
"""
import pandas as pd
# 读取Excel文件
data = pd.read_excel(name)
# 获取表头
headers = data.columns.tolist()
# 对每一列进行处理
new_data = pd.DataFrame()
list_data = []
for column in headers:
# 获取不重复的元素
print("--------------------------------------------")
print("正在处理列:", column)
unique_values = data[column].unique()
print("这一列元素与类别对应关系如下:", end=" ")
list_values = list(unique_values)
for i in range(len(list_values)):
print("【", i, ",",list_values[i], "】", end=" ")
print()
# 将元素映射为类别
mapping = {value: i + 1 for i, value in enumerate(unique_values)}
# 替换原始数据
new_column = data[column].replace(mapping)
new_data[column] = new_column
list_data.append(list(new_column))
print("这一列处理后:", list(new_column))
return list_data
- 将处理后的列进行卡方计算
def get_result(x,y):
"""
传入两列变量
获得卡方值
(如果需要的是p值,则返回p_value就行)
"""
observed = [x,y]
chi2_value, p_value, degrees_of_freedom, expected = chi2_contingency(observed)
return chi2_value
- 打印结果
def print_result(result):
for i in result:
for j in i:
print("%.4f" % j, end=" ")
print()
- 所有步骤执行
if __name__ == "__main__":
data = get_data()
n = len(data)
result = np.zeros((n, n))
for i in range(n):
for j in range(n):
result[i][j] = get_result(data[i],data[j])
print("---------------------------------------------------------")
print("以下是变量的关联表::")
print_result(result)
完整代码
name = 'data.xlsx'
import numpy as np
from scipy.stats import chi2_contingency
import pandas as pd
def get_data():
"""
获得数据,并转成数字形式
"""
import pandas as pd
# 读取Excel文件
data = pd.read_excel(name)
# 获取表头
headers = data.columns.tolist()
# 对每一列进行处理
new_data = pd.DataFrame()
list_data = []
for column in headers:
# 获取不重复的元素
print("--------------------------------------------")
print("正在处理列:", column)
unique_values = data[column].unique()
print("这一列元素与类别对应关系如下:", end=" ")
list_values = list(unique_values)
for i in range(len(list_values)):
print("【", i, ",",list_values[i], "】", end=" ")
print()
# 将元素映射为类别
mapping = {value: i + 1 for i, value in enumerate(unique_values)}
# 替换原始数据
new_column = data[column].replace(mapping)
new_data[column] = new_column
list_data.append(list(new_column))
print("这一列处理后:", list(new_column))
return list_data
def get_result(x,y):
"""
传入两个变量
获得卡方p值
"""
observed = [x,y]
chi2_value, p_value, degrees_of_freedom, expected = chi2_contingency(observed)
return chi2_value
def print_result(result):
for i in result:
for j in i:
print("%.4f" % j, end=" ")
print()
if __name__ == "__main__":
data = get_data()
n = len(data)
result = np.zeros((n, n))
for i in range(n):
for j in range(n):
result[i][j] = get_result(data[i],data[j])
print("---------------------------------------------------------")
print("以下是变量的关联表::")
print_result(result)
结果
数据参考
船公司 | 船名称 | 作业港口 | 提单号 | 集装箱箱号 | 箱尺寸(TEU) | 启运地 | 目的地 |
---|---|---|---|---|---|---|---|
昌盛船务 | 宏泰7778 | 苏州港 | TKNG2924820 | YWCM8054 | 20 | 南通港 | 苏州港 |
行航国际 | 九华山89 | 太仓港 | HYJZ8535058 | YWCM8054,MWYW9507 | 20 | 镇江港 | 太仓港 |
衡旺船务 | 浙兰溪油0011 | 太仓港 | QPYT7971799 | FLTI8262,OSIF9340,XBCB2364,FFKG3610,KPOX7915 | 40 | 苏州港 | 太仓港 |
衡旺船务 | 浙兰溪油0010 | 马鞍山港 | XNCX7357570 | FLTI8262 | 40 | 镇江港 | 马鞍山港 |
衡旺船务 | 双建6 | 马鞍山港 | OXVX5642772 | FLTI8262,OSIF9340,XBCB2364,FFKG3610,KPOX7915 | 40 | 杭州港 | 马鞍山港 |
创新船舶 | 晟鑫拖1 | 太仓港 | XCFN3102888 | FLTI8262 | 40 | 太仓港 | 太仓港 |
昌盛船务 | 缘升126 | 镇江港 | NIWN1210037 | YWCM8054,MWYW9507,EORV1154,MBMK3116,KLHJ5687 | 20 | 杭州港 | 镇江港 |
行航国际 | 涪港801 | 苏州港 | OQVM7842727 | YWCM8054,MWYW9507,EORV1154,MBMK3116,KLHJ5687 | 20 | 马鞍山港 | 苏州港 |
景江船舶 | 祥龙866 | 镇江港 | SQCX6289821 | FLTI8262,OSIF9340,XBCB2364 | 40 | 镇江港 | 镇江港 |
昌盛船务 | 腾飞10 | 泰州港 | PJOV6255448 | YWCM8054,MWYW9507,EORV1154 | 20 | 太仓港 | 泰州港 |
景江船舶 | 渝航808 | 苏州港 | MPPF8400827 | YWCM8054 | 20 | 镇江港 | 苏州港 |
创新船舶 | 宝腾8 | 铜陵港 | UUVI8892787 | RJOO5157,QQHF8188,TQUT4690,QCSF6000 | 20 | 马鞍山港 | 铜陵港 |
结果
中间过程
这些打印出来是为了方便查看或检查有没有错误
D:\User\anaconda\python.exe "E:\桌面\卡方(1)\main.py"
--------------------------------------------
正在处理列: 船公司
这一列元素与类别对应关系如下: 【 0 , 昌盛船务 】 【 1 , 行航国际 】 【 2 , 衡旺船务 】 【 3 , 创新船舶 】 【 4 , 景江船舶 】
这一列处理后: [1, 2, 3, 3, 3, 4, 1, 2, 5, 1, 5, 4]
--------------------------------------------
正在处理列: 船名称
这一列元素与类别对应关系如下: 【 0 , 宏泰7778 】 【 1 , 九华山89 】 【 2 , 浙兰溪油0011 】 【 3 , 浙兰溪油0010 】 【 4 , 双建6 】 【 5 , 晟鑫拖1 】 【 6 , 缘升126 】 【 7 , 涪港801 】 【 8 , 祥龙866 】 【 9 , 腾飞10 】 【 10 , 渝航808 】 【 11 , 宝腾8 】
这一列处理后: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
--------------------------------------------
正在处理列: 作业港口
这一列元素与类别对应关系如下: 【 0 , 苏州港 】 【 1 , 太仓港 】 【 2 , 马鞍山港 】 【 3 , 镇江港 】 【 4 , 泰州港 】 【 5 , 铜陵港 】
这一列处理后: [1, 2, 2, 3, 3, 2, 4, 1, 4, 5, 1, 6]
--------------------------------------------
正在处理列: 提单号
这一列元素与类别对应关系如下: 【 0 , TKNG2924820 】 【 1 , HYJZ8535058 】 【 2 , QPYT7971799 】 【 3 , XNCX7357570 】 【 4 , OXVX5642772 】 【 5 , XCFN3102888 】 【 6 , NIWN1210037 】 【 7 , OQVM7842727 】 【 8 , SQCX6289821 】 【 9 , PJOV6255448 】 【 10 , MPPF8400827 】 【 11 , UUVI8892787 】
这一列处理后: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
--------------------------------------------
正在处理列: 集装箱箱号
这一列元素与类别对应关系如下: 【 0 , YWCM8054 】 【 1 , YWCM8054,MWYW9507 】 【 2 , FLTI8262,OSIF9340,XBCB2364,FFKG3610,KPOX7915 】 【 3 , FLTI8262 】 【 4 , YWCM8054,MWYW9507,EORV1154,MBMK3116,KLHJ5687 】 【 5 , FLTI8262,OSIF9340,XBCB2364 】 【 6 , YWCM8054,MWYW9507,EORV1154 】 【 7 , RJOO5157,QQHF8188,TQUT4690,QCSF6000 】
这一列处理后: [1, 2, 3, 4, 3, 4, 5, 5, 6, 7, 1, 8]
--------------------------------------------
正在处理列: 箱尺寸(TEU)
这一列元素与类别对应关系如下: 【 0 , 20 】 【 1 , 40 】
这一列处理后: [1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1]
--------------------------------------------
正在处理列: 启运地
这一列元素与类别对应关系如下: 【 0 , 南通港 】 【 1 , 镇江港 】 【 2 , 苏州港 】 【 3 , 杭州港 】 【 4 , 太仓港 】 【 5 , 马鞍山港 】
这一列处理后: [1, 2, 3, 2, 4, 5, 4, 6, 2, 5, 2, 6]
--------------------------------------------
正在处理列: 目的地
这一列元素与类别对应关系如下: 【 0 , 苏州港 】 【 1 , 太仓港 】 【 2 , 马鞍山港 】 【 3 , 镇江港 】 【 4 , 泰州港 】 【 5 , 铜陵港 】
这一列处理后: [1, 2, 2, 3, 3, 2, 4, 1, 4, 5, 1, 6]
最后结果
---------------------------------------------------------
以下是变量的关联表::
0.0000 7.8206 8.8444 7.8206 10.3121 2.2714 9.1514 8.8444
7.8206 0.0000 6.7909 0.0000 5.8725 8.0329 6.0709 6.7909
8.8444 6.7909 0.0000 6.7909 2.1663 4.2429 5.6202 0.0000
7.8206 0.0000 6.7909 0.0000 5.8725 8.0329 6.0709 6.7909
10.3121 5.8725 2.1663 5.8725 0.0000 5.0061 3.5576 2.1663
2.2714 8.0329 4.2429 8.0329 5.0061 0.0000 4.6747 4.2429
9.1514 6.0709 5.6202 6.0709 3.5576 4.6747 0.0000 5.6202
8.8444 6.7909 0.0000 6.7909 2.1663 4.2429 5.6202 0.0000