【数据分析】数据的计量尺度、数据集中趋势

一、数据的计量尺度

  • 数据的计量尺度分为四类:定类尺度、定序尺度、定距尺度、定比尺度。
数据的计量尺度特点逻辑与数学运算常见的例子数据类型
定类尺度无等级次序是否相等

性别:男、女...

民族:汉族、满族...

职业:医生、消防员...

定性数据
定序尺度内在固有顺序比较大小、是否相等

职称:高级、初级...

健康状况:优良中差

质量等级:优良中差

定距尺度

“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)
  • 输出:

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值