Расчет ожидаемой частоты и реализация хи-квадратPython

Программы на Python
Anonymous
Расчет ожидаемой частоты и реализация хи-квадрат

Сообщение Anonymous »

У меня есть данные в CSV-файле с именем «Data.csv», в котором особое внимание уделяется столбцу «Температура воздуха». Я попытался подогнать данные, используя два распределения: «гамма» и «логарифмически нормальное». Теперь я не уверен, правильно ли я рассчитал ожидаемую частоту и точна ли моя реализация теста хи-квадрат.
Вот конкретные проблемы, с которыми я столкнулся:
Расчет ожидаемой частоты: мне нужно уточнить правильный метод расчета ожидаемых частот для теста хи-квадрат при подгонке «гамма» и «логарифмически нормального» распределений к моим данным.Реализация теста хи-квадрат: я не уверен, правильна ли моя реализация теста хи-квадрат. Я был бы признателен за рекомендации по правильным шагам и любым необходимым исправлениям.
Если возможно, может ли кто-нибудь предоставить правильный подход к вычислению ожидаемых частот и правильную реализацию теста хи-квадрат для моего случай?
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
from scipy.stats import gamma, lognorm, kstest, chisquare, chi2_contingency
import warnings

warnings.simplefilter(action='ignore', category=FutureWarning)

df = pd.read_csv(f'Data.csv')

# Extract data
temperature = df['Air_Temperature(AT)']

def cs(n, y):
return chisquare(n, np.sum(n) / np.sum(y) * y)

def interpret_goodness_of_fit(chi2_p, ks_p, alpha=0.05):
if chi2_p > alpha or ks_p > alpha:
return "Good fit"
else:
return "Not a good fit"

# Calculate bin size
number_of_bins = int(1 + np.log2(len(temperature)))
print("Number of bins:", number_of_bins)

# Fit gamma distribution
gamma_params = gamma.fit(temperature)
print("Gamma distribution parameters:", gamma_params)

# Fit log-normal distribution
lognorm_params = lognorm.fit(temperature)
print("Log-normal distribution parameters:", lognorm_params)
print("---------------")

# Generate fitted gamma distribution
x = np.linspace(min(temperature), max(temperature), 100)
gamma_pdf_fitted = gamma.pdf(x, *gamma_params)

# Generate fitted log-normal distribution
lognorm_pdf_fitted = lognorm.pdf(x, *lognorm_params)

# Plot histogram with KDE and fitted distributions
plt.figure(figsize=(10, 6))
sns.histplot(df, x="Air_Temperature(AT)", bins=number_of_bins, kde=True, stat='density', label='Data with KDE')
plt.plot(x, gamma_pdf_fitted, 'r-', label='Fitted Gamma Distribution')
plt.plot(x, lognorm_pdf_fitted, 'g-', label='Fitted Log-normal Distribution')
plt.xlabel('Air Temperature')
plt.ylabel('Density')
plt.title(f"Density Plot")
plt.legend()
plt.show()

# Chi-Square Test
observed_freq, bins = np.histogram(temperature, bins=number_of_bins, density=False)

expected_freq_gamma = len(temperature) * gamma.cdf(bins[1:], *gamma_params) - len(temperature) * gamma.cdf(bins[:-1], *gamma_params)

expected_freq_lognorm = len(temperature) * lognorm.cdf(bins[1:], *lognorm_params) - len(temperature) * lognorm.cdf(bins[:-1], *lognorm_params)

result_goodness_of_fit_gamma = cs(observed_freq, expected_freq_gamma)
result_goodness_of_fit_log_normal = cs(observed_freq, expected_freq_lognorm)
print(f"Result of Goodness of Fit of Gamma is {result_goodness_of_fit_gamma}")
print(f"Result of Goodness of Fit of Log-Normal is {result_goodness_of_fit_log_normal}")
print("---------------")

# KS-Test
ks_stat_gamma, ks_p_gamma = kstest(temperature, 'gamma', args=gamma_params)
ks_stat_lognorm, ks_p_lognorm = kstest(temperature, 'lognorm', args=lognorm_params)

print(f"Gamma KS statistic: {ks_stat_gamma}, p-value: {ks_p_gamma}")
print(f"Log-normal KS statistic: {ks_stat_lognorm}, p-value: {ks_p_lognorm}")
print("---------------")

chi2_stat_gamma, chi2_p_gamma = cs(observed_freq, expected_freq_gamma)
chi2_stat_lognorm, chi2_p_lognorm = cs(observed_freq, expected_freq_lognorm)

gamma_fit = interpret_goodness_of_fit(chi2_p_gamma, ks_p_gamma)
lognorm_fit = interpret_goodness_of_fit(chi2_p_lognorm, ks_p_lognorm)

print(f"Gamma distribution goodness of fit: {gamma_fit}")
print(f"Log-normal distribution goodness of fit: {lognorm_fit}")


Подробнее здесь: https://stackoverflow.com/questions/786 ... ementation

Вернуться в «Python»