이항 분포의 확률 질량 함수를 파이썬으로 작성해보십시오.

수학이나 통계에 흥미가 있습니다만, 수식을 봐도 기호가 너무 있어 어느 것이 무엇인지 모르게 되거나, 곧 잊어 버리기 때문에, 배운 것을 프로그램에 써 보는 것에 했습니다.

이번에는 전체 시도 횟수 n회 성공 확률 p의 이항 분포에 대해 다음과 같은 기능을 가진 클래스를 작성합니다.
  • 성공 횟수 x 확률 질량 얻기
  • x의 하단 누적 확률 얻기
  • x의 위쪽 누적 확률 얻기
  • 그래프 그리기

  • 표현식의 내용을 기억하는 것이 목적이므로 성능은 고려하지 않습니다.

    이번 파이썬으로 재현하는 공식



    성공 확률이 p의 베르누이 시행(이항 시행)을 전부 n회 실시했을 때의,

    성공 횟수가 x가 될 확률 질량을 구하는 함수


    f(x,n,p) = {}_n \mathrm{ C }_xp^x(1-p)^{ n-x } \quad (0 \leqq n;\ 0 \leqq x \leqq n;\ 0 \leqq p\leqq 1)\\
    

    성공 횟수 x의 하측 누적 확률을 구하는 함수


    P(n,x,p) = \sum_{i=0}^xf(i,n,p)
    

    성공 횟수 x의 위쪽 누적 확률을 찾는 함수


    P(n,x,p) = \sum_{i=x}^nf(i,n,p)
    

    파이썬으로 작성해 보았습니다.


    
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    
    class ToolBox:
    
      def combination(total, chosen):
          return math.factorial(total) / math.factorial(chosen)/ math.factorial(total-chosen)
    
    class BinomialDistribution:
      """
       全試行回数nと成功確率pの二項分布オブジェクトを生成する.
    
        Attributes
        ----------
        total : int
          全試行回数n.
        p_of_sccess : float
          一回の試行における成功確率p.
        p_of_fail : float
          一回の試行における失敗確率1-p.
      """
    
      def __init__(self, total, p_of_success):
        """
        Parameters
        ----------
        total : int
            全試行回数n.
        p_of_success : float
            一回の試行における成功確率p.
        """
        assert total > 0, "Condition error: 0 <= total"
        assert p_of_success >= 0 and p_of_success <= 1, "Condition error: 0 <= p_of_success <= 1"
    
        self.total = total
        self.p_of_sccess = p_of_success
        self.p_of_fail = 1 - p_of_success
    
      def get_probability_mass(self, success):
        """
        x回成功する確率質量を求める
    
        Parameters
        ----------
        success : int
            成功回数x.
    
        Returns
        -------
        probability_mass : float
            xの確率質量.
        """
        assert success >= 0 and success <= self.total, "Condition error: 0 <= sccuess <= total"
    
        fail = self.total - success
        combination = ToolBox.combination(self.total, success)
        probability_mass = combination * (self.p_of_sccess ** success) * (self.p_of_fail) ** fail
        return probability_mass
    
      def get_lower_culmitive_distribution(self, success):
        """
        xの下側累積確率(0〜x回の確率質量の和)を求める.
    
        Parameters
        ----------
        success : int
            成功回数x.
    
        Returns
        -------
        result : float
            xの下側累積確率.
        """
        result = 0
        for i in range (0, success + 1):
          result += binomial_distribution.get_probability_mass(i)
        return result
    
      def get_upper_culmitive_distribution(self, success):
        """
        xの上側累積確率(x〜全試行回数の確率質量の和、)を求める.
    
        Parameters
        ----------
        success : int
            成功回数x.
    
        Returns
        -------
        result : float
            xの上側累積確率.
        """
        result = 0
        for i in range (success, self.total + 1):
          result += binomial_distribution.get_probability_mass(i)
        return result
    
      def draw_graph(self):
        """
        グラフを描画してpng形式で保存する.
        """
        x = np.arange(0, self.total + 1, 1)
        y = []
        for i in range(0, self.total + 1):
          y.append(self.get_probability_mass(i))
        plt.plot(x, y)
        plt.savefig('graph.png')
    

    실행


    
    # 全試行回数10回、成功確率0.5の二項分布オブジェクトを作成する.
    binomial_distribution = BinomialDistribution(10, 0.5)
    
    # 成功回数2回の場合の確率質量を取得する.
    print(binomial_distribution.get_probability_mass(2))
    
    # 成功確率2回の場合の下側累積確率を取得する.
    print(binomial_distribution.get_lower_culmitive_distribution(2))
    
    # 成功確率2回の場合の上側累積確率を取得する.
    print(binomial_distribution.get_upper_culmitive_distribution(2))
    
    # この二項分布のグラフを描画する.
    binomial_distribution.draw_graph()
    

    결과


    0.0439453125 # 成功回数2回の場合の確率質量
    0.0546875 # 成功確率2回の場合の下側累積確率
    0.9892578125 # 成功確率2回の場合の上側累積確率
    

    답변은 여기 사이트를 사용했습니다.
    htps : // 케이씨. 카시오. jp/에 c/sys m/1161228843

    그래프는 동일한 디렉토리에 저장됩니다.


    2020년 4월 7일 수정 내용


  • 「확률 밀도 함수(Probability Density Function, PDF)」로 하고 있던 개소를 「확률 질량 함수(Probability Mass Function, PMF)」로 수정. 확률 변수 x(이번 경우 success )가 이산적인 값인 경우 후자를 사용하는 것 같다. 그러나 이산 이항 분포에 대해 "확률 밀도"를 사용하는 사이트와 책도 있으므로 엄격하게 구별되지 않는 것 같습니다.
  • Matplotlib를 사용하여 그래프 그리기 기능 추가
  • 성공 횟수 x (successs)를 생성자에서 분리하고 메서드 호출시 지정하도록 수정
  • 수식 표기법 오류 수정

  • 참고로 한 사이트



    MathJax를 작성하는 방법
    h tps : // 에아 sy - py - 마 th 그럼 x. 나카켄 88. 코m/

    이항 분포를 계산하는 사이트
    htps : // 케이씨. 카시오. jp/에 c/sys m/1161228843

    확률 밀도 함수와 확률 질량 함수
    h tps://다타-s 시엔세. gr. jp / teo ry / tbs_pdf_an d_pmf. HTML

    좋은 웹페이지 즐겨찾기