一、数据的计量尺度
- 数据的计量尺度分为四类:定类尺度、定序尺度、定距尺度、定比尺度。
数据的计量尺度 | 特点 | 逻辑与数学运算 | 常见的例子 | 数据类型 |
---|---|---|---|---|
定类尺度 | 无等级次序 | 是否相等 | 性别:男、女... 民族:汉族、满族... 职业:医生、消防员... | 定性数据 |
定序尺度 | 内在固有顺序 | 比较大小、是否相等 | 职称:高级、初级... 健康状况:优良中差 质量等级:优良中差 | |
定距尺度 | “0”只是尺度上的一个点,不代表“不存在” | 比较大小、加减运算 | 摄氏温度、纬度 | 定量数据 |
定比尺度 (比率尺度) | "0"表示“没有”或“不存在” 可以计算两个测度值之间的比值 | 比较大小、加减乘除 | 质量、长度、能量 |
二、数据的集中趋势
- 集中趋势在统计学中指一组数据向一中心值靠拢的程度,反应一组数据中心店所在位置。
- 集中趋势测度就是寻找数据水平的代表值或中心值。
- 常见指标:平均数、分位数、众数。
1、平均数
- 适用于定量数据,不适用于定性数据。
- 平均数有不同的计算形式和计算公式,主要包括:算术平均数、加权算法平均数、几何算法平均数等。
- 平均数容易受极端值影响:平均数随着极端值的变化而变化,且有向极端值靠近的趋势。
2、分位数
- 适用于顺序数据、定量数据。
- 常见分位数:中位数、四分位数、百分位数
百分位数:
- 在按升序排序的数列中,其左侧的观察个数在整个样本中占比p%,右侧的观察个数在整个样本中占比为 (100-p)%。
四分位数:
- 是特殊的百分位数,不受极端值的影响。
- 将所有数据按升序排序,并分成四等份,处于三个分割点位置的数字就是四分位数。
- 第一四分位数(Q1)为较小四分位数,是第 25% 的数字。
- 第二四分位数(Q2)为中位数,是第 50% 的数字。
- 第三四分位数(Q3)为较大四分位数,是第 75% 的数字。
中位数:
- 特殊的四分位数
- 不收极端值的影响
- 计算公式分两种情况:
- 当 n 为奇数时:中位数 = (n+1)/2 位置上数据的值
- 当 n 为偶数时:中位数 = (n)/2 位置和 (n)/2+1 位置上数据的平均值
3、众数
- 适用于分类数据、顺序数据、定量数据。
- 描述分类数据的集中趋势最常见的测度值
- 只有在数据量较大的情况下,众数才有意义
- 主要特点是不收极端值的影响
- 一组数据中,不是只有一个众数,有可能有多个众数或者没有众数。
三、Python 中如何计算平均数、分位数、众数?
1、简单公式运算
import numpy as np
import pandas as pd
from scipy import stats
# 生成包含 10 个介于 0 到 5 之间的随机浮点数,再转换成整数
data_floats = np.random.random(size=10)*6
data = data_floats.astype(int).tolist()
print(data)
mean_value = np.mean(data)
print(f'平均数:{mean_value}')
quantiles = np.quantile(data, [0.25, 0.5, 0.75])
print(f'分位数:第一四分位({quantiles[0]}), 中位数({quantiles[1]}), 第三四分位({quantiles[2]})')
mode_value = stats.mode(data)
print(f'众数:{mode_value[0][0]}')
- 输出:
>>> [5, 3, 5, 2, 2, 2, 4, 3, 4, 2]
>>> 平均数:3.2
>>> 分位数:第一四分位(2.0), 中位数(3.0), 第三四分位(4.0)
>>> 众数:2
2、图表中呈现
import dash
from dash import dcc, html
from dash.dependencies import Input, Output
import plotly.express as px
import pandas as pd
import numpy as np
# 生成随机数据
# 1. 可以手动生成列表
# data = np.array([11, 7, 33, 30, 21, 57, 25, 92, 24, 64, 8, 64, 77, 39, 27, 99, 51, 4, 66, 31,
# 6, 87, 39, 46, 73, 36, 24, 65, 70, 78, 87, 9, 85, 23, 45, 93, 77, 2, 77, 15,
# 76, 77, 32, 89, 33, 23, 80, 28, 93, 70, 36, 12, 96, 39, 11, 97, 57, 36, 75, 30])
# 2. 可以用 random 生成包含 120 个介于 0 到 100 之间的随机浮点数,再转换成整数
# data_floats = np.random.random(size=120) * 100
# data = data_floats.astype(int).tolist()
# 3. 可以用 randint 生成包含 120 个介于 0 到 100 之间的随机整数列表
data = np.random.randint(0, 100, size=1000).tolist()
df = pd.DataFrame(data, columns=['Value'])
app = dash.Dash(__name__)
# 假设 bin_size 是我们知道的或者从直方图创建时确定的
m_bin = 30 # 直方图的 bin 数量
bin_size = (max(df['Value']) - min(df['Value'])) / m_bin
# 创建 Dash 应用程序
def create_histogram(df, m_bin):
mean_value = df['Value'].mean()
mode_value = df['Value'].mode()[0]
quantiles = np.quantile(df['Value'], [0.25, 0.5, 0.75])
# 创建直方图
histogram_fig = px.histogram(df, x='Value', nbins=m_bin,
barmode='overlay',
labels={'Value': '数据值'},
title='直方图 - 四分位数、平均数和众数',
color_discrete_sequence=['lightblue'])
histogram_fig.update_traces(
marker=dict(line=dict(width=1, color='gray'))
)
# 添加统计信息的线条和注解
histogram_fig.add_vline(x=mean_value,
line_dash='dash',
line_color='red',
annotation_text=f'平均数: {mean_value:.2f}',
annotation_position='top left')
histogram_fig.add_vline(x=mode_value,
line_dash='solid',
line_color='lightgreen',
annotation_text=f'众数: {mode_value}',
annotation_position='top right')
for i, q in enumerate(quantiles, 1):
histogram_fig.add_vline(x=q,
line_dash='solid' if i == 2 else 'dash',
line_color='orange',
annotation_text=f'第{i}四分位数: {q:.2f}',
annotation_position='top')
return histogram_fig
# 回调函数:根据直方图的点击事件更新箱线图
@app.callback(
Output('box-plot', 'figure'),
[Input('histogram', 'clickData')]
)
def update_box_plot(clickData):
if clickData and clickData['points']:
# 获取点击的柱状图的索引和 x 值
point = clickData['points'][0]
x = point['x']
# 根据点击的柱状图确定数据范围
lower_bound = x - bin_size
upper_bound = x + bin_size
# 筛选数据
filtered_df = df[(df['Value'] >= lower_bound) & (df['Value'] < upper_bound)]
# 更新箱线图
fig = px.box(filtered_df, y='Value', title=f'Box plot for bin {lower_bound} : {upper_bound}')
else:
# 如果没有点击数据,显示完整数据的箱线图
fig = px.box(df, y='Value', title='完整数据的箱线图')
return fig
histogram_fig = create_histogram(df, m_bin)
# 定义应用程序的布局
app.layout = html.Div([
html.H1('数据统计图'),
# 初始为空的箱线图组件
dcc.Graph(id='box-plot'),
# 将创建的直方图添加到布局中
dcc.Graph(id='histogram', figure=histogram_fig)
])
# 运行应用程序
if __name__ == '__main__':
app.run_server(debug=True)
- 输出: