某厂对50名计件工人某月份工资进行登记,获得以下原始资料(单位:元)(mvsExer.xlsx, E2_2) 试按组距为300编制频数表,计算频数、频率和累积频率,并绘制直方图 (1) 写出Python程序 (2) 用Python进行基本统计分析
时间: 2024-09-26 10:07:15 浏览: 60
(1)Python程序可以按照以下步骤编写,用于读取数据、分组计算、绘图以及基本统计分析:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
data_df = pd.read_excel('mvsExer.xlsx', sheet_name='E2_2', names=['工资'])
# 设置组距和范围
bin_width = 300
min_salary = data_df['工资'].min()
max_salary = data_df['工资'].max()
bins = np.arange(min_salary, max_salary + bin_width, bin_width)
# 分箱并计算频数、频率和累积频率
freq_table = pd.cut(data_df['工资'], bins=bins, labels=False, right=False).value_counts()
freq_table = freq_table.sort_index() # 对数据排序
total_count = len(data_df)
freq_table['频率'] = freq_table / total_count
cum_freq_table = freq_table.cumsum()
# 绘制直方图
plt.figure(figsize=(10, 6))
freq_table.plot(kind='bar', align='edge', width=bin_width, edgecolor='black')
plt.title('工资分布直方图')
plt.xlabel('工资区间')
plt.ylabel('频数')
plt.show()
# 基本统计分析
mean_salary = data_df['工资'].mean()
median_salary = data_df['工资'].median()
mode_salary = data_df['工资'].mode().iloc[0] if mode_salary := data_df['工资'].mode().any() else None
std_dev_salary = data_df['工资'].std()
print("频数表:\n", freq_table)
print("频率表:\n", freq_table['频率'])
print("累积频率表:\n", cum_freq_table)
print(f"平均工资:{mean_salary:.2f}元")
print(f"中位数工资:{median_salary:.2f}元")
if mode_salary is not None:
print(f"众数工资:{mode_salary:.2f}元")
else:
print("众数未找到")
print(f"工资标准差:{std_dev_salary:.2f}元")
```
(2)在这个Python脚本中,基本统计分析主要包括:
- 平均工资(mean_salary):使用pandas的`mean()`函数计算工资的平均值。
- 中位数工资(median_salary):使用`median()`函数计算工资的中位数,即把工资分为两半的数值点。
- 众数工资(mode_salary):如果存在众数,则使用`mode()`函数找出最常见的工资值;若无众数则返回`None`。
- 工资标准差(std_dev_salary):使用`std()`函数计算工资的方差后开根号,反映工资数据分散程度。
阅读全文