卡方

需求

给定excel文件,读取文件内的几列数据,获取几列数据之间的卡方值。

步骤与代码

  1. 准备
    引入包,设置文件名
name = 'data.xlsx'
import numpy as np
from scipy.stats import chi2_contingency
import pandas as pd
  1. 按列读取数据,并将类别转化为数字
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
  1. 将处理后的列进行卡方计算
def get_result(x, y):
    """
    传入两个变量
    获得卡方p值
    """
    data = np.zeros((max(x), max(y)))
    for i in range(len(x)):
        data[x[i] - 1][y[i] - 1] += 1
    chi2_value, p_value, degrees_of_freedom, expected = chi2_contingency(np.array(data))
    return p_value
  1. 打印结果
def print_result(result):
    for i in result:
        for j in i:
            print("%.4f" % j, end="   ")
        print()
  1. 所有步骤执行
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值
    """
    data = np.zeros((max(x), max(y)))
    for i in range(len(x)):
        data[x[i] - 1][y[i] - 1] += 1
    chi2_value, p_value, degrees_of_freedom, expected = chi2_contingency(np.array(data))
    return p_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 
posted @ 2023-08-23 14:52  jijfurhg  阅读(125)  评论(0编辑  收藏  举报