2011-07-26 4 views
6

क्या वक्रार 2 फ़ील्ड में मानों के सहसंबंध की जांच करने के लिए ओरेकल 11 में एक अंतर्निहित तरीका है? उदाहरण के लिए, इस जैसे एक साधारण मेज दिया:वर्कर मूल्यों का सहसंबंध

MEAL_NUM INGREDIENT 
-------------------- 
1   BEEF 
1   CHEESE 
1   PASTA 
2   CHEESE 
2   PASTA 
2   FISH 
3   CHEESE 
3   CHICKEN 

मैं एक संख्यात्मक संकेत है कि MEAL_NUM के आधार पर प्राप्त करना चाहते हैं, पनीर ज्यादातर पास्ता के साथ और साथ बीफ, चिकन, और मछली डिग्री कम करने के लिए जोड़ा जाता है।

मेरा पहला झुकाव सीओआरआर फ़ंक्शन का उपयोग करना है और स्ट्रिंग को शायद किसी संख्या में बदलकर या अनोखा चयन से राउनम को पकड़कर शायद एक संख्या में बदलना है।

कोई सुझाव इस बारे में कैसे जाना है?

उत्तर

0

इस तरह की एक प्रश्न के बारे में क्या?

select t1.INGREDIENT, count(*)a 
from table t1, 
    (select meal_num 
     from table 
     where INGREDIENT = 'CHEESE') t2 
where t1.INGREDIENT <> 'CHEESE' 
and t1.meal_num=t2.mealnum 
group by t1.INGREDIENT; 

परिणाम प्रत्येक घटक को CHEESE के साथ food_num साझा करने की संख्या होनी चाहिए।

3

आप CORR का उपयोग नहीं करना चाहेंगे - यदि आप "खाद्य संख्या" बनाते हैं और बीफ = 1, चिकन = 2, और पास्ता = 3 असाइन करते हैं, तो एक सहसंबंध गुणांक आपको बताएगा कि बढ़ी हुई पनीर बढ़ने से संबंधित है या नहीं "भोजन संख्या"। लेकिन जब आप इसे बनाते हैं तो "भोजन संख्या" उच्च या निम्न होने का मतलब कुछ भी नहीं है। तो, CORR का उपयोग न करें जब तक कि आपके खाद्य पदार्थ वास्तव में किसी तरह से आदेश नहीं दिए जाते हैं, जैसे संख्याएं हैं।

सांख्यिकीविद इस बारे में बात करते हैं levels of measurement के साथ। लिंक्ड आलेख की भाषा में, MEAL_NUM एक मामूली उपाय है - या भोजन के क्रम में शायद एक मामूली उपाय हो सकता है, लेकिन किसी भी तरह से, इस पर सहसंबंध गुणांक का उपयोग करना वास्तव में एक बुरा विचार है।

शायद आप कुछ ऐसा करना चाहते हैं जैसे "बीफ भोजन के प्रतिशत में पनीर भी है?" निम्नलिखित प्रत्येक घटक के लिए, इसमें युक्त भोजन की संख्या और इसे और पनीर युक्त भोजन की संख्या के लिए वापस आ जाएगा। चाल यह है कि COUNT केवल गैर-शून्य मानों की गणना करता है।

SELECT Other.Ingredient, 
     COUNT(*) AS TotalMeals, 
     COUNT(Cheese.Ingredient) AS CheesyMeals 
    FROM table Other 
LEFT JOIN table Cheese 
     ON (Cheese.Ingredient = 'Cheese' 
     AND Cheese.Meal_Num = Other.Meal_Num) 
GROUP BY Other.Ingredient 

चेतावनी: यदि आप किसी भी भोजन में दो बार एक घटक शामिल करते हैं तो गलत परिणाम लौटाते हैं।

संपादित करें: यह पता चला है कि आप विशेष रूप से पनीर में रुचि नहीं रखते हैं। आप वास्तव में "सहसंबंध" के सभी जोड़े चाहते हैं। इसलिए, हम "पनीर" को अमूर्त कर सकते हैं और उन्हें केवल प्रथम और द्वितीय सामग्री कह सकते हैं। मैंने इस पर एक "संभावितस्कोर" जोड़ा है जो प्रतिशत के भोजन की तरह कार्य करने की कोशिश करता है लेकिन अगर घटक के बहुत कम उदाहरण हैं तो मजबूत स्कोर नहीं देते हैं।

SELECT First.Ingredient, 
     Second.Ingredient, 
     COUNT(*) AS MealsWithFirst, 
     COUNT(First.Ingredient) AS MealsWithBoth, 
     COUNT(First.Ingredient)/(COUNT(*) + 3) AS PossibleScore, 
    FROM table First 
LEFT JOIN table Second 
     ON (First.Meal_Num = Second.Meal_Num) 
GROUP BY First.Ingredient, Second.Ingredient 

जब स्कोर के अनुसार क्रमबद्ध, इस लौटना चाहिए

PASTA CHEESE 2 2 0.400 
CHEESE PASTA  3 2 0.333 
BEEF  CHEESE 1 1 0.250 
BEEF  PASTA  1 1 0.250 
FISH  CHEESE 1 1 0.250 
FISH  PASTA  1 1 0.250 
CHICKEN CHEESE 1 1 0.250 
PASTA BEEF  2 1 0.200 
PASTA FISH  2 1 0.200 
CHEESE BEEF  3 1 0.167 
CHEESE FISH  3 1 0.167 
CHEESE CHICKEN 3 1 0.167 
+2

यह वास्तव में अच्छी जानकारी है। मुझे लगता है कि ओपी कोर() जैसे फ़ंक्शन का उपयोग करना चाहता था, इसलिए वह इसे केवल एक घटक के बजाय पूरे डेटा सेट पर लागू कर सकता था। –

+0

@ जेम्स ओह; यह वास्तव में एक बहुत अच्छा मुद्दा है। यह मेरी "पनीर" तालिका को सामान्यीकृत करने के लिए एक दिलचस्प अभ्यास होगा ताकि इसे "पनीर" नहीं कहा जाता है, लेकिन मैं ओपी से सुनने के लिए इंतजार करूंगा। –

+0

हां, मैं इस बात को पूरे डेटासेट पर चलाने की योजना बना रहा हूं। – owook

2

एक आत्म करो शामिल होने के दो meal_nums

SELECT t1.INGREDIENT, t2.INGREDIENT, CORR(t1.MEAL_NUM, t2.MEAL_NUM) 
FROM TheTable t1, TheTable t2 
WHERE t1.INGREDIENT < t2.INGREDIENT 
GROUP BY t1.INGREDIENT, t2.INGREDIENT 

आप देना चाहिए द्वारा सभी घटक के संयोजन में, तो corr पाने के लिए कुछ ऐसा:

BEEF CHEESE 0.999 
BEEF PASTA 0.998 
CHEESE PASTA 0.977 

अद्यतन: क्रिस बताते हैं, यह इस तरह काम नहीं करेगा।मैं उम्मीद कर रहा था कि क्रमशः भोजन_नम अंतराल (@Chris, लिंक के लिए धन्यवाद) मान से मैपिंग को झुकाव करने का कोई तरीका हो सकता है। यह संभव नहीं हो सकता है, इस मामले में यह जवाब मदद नहीं करेगा।

+1

मुझे यकीन है कि यह एक बुरा विचार है; यदि भोजन 2, 3, 4 भोजन में प्रकट होता है और पनीर केवल भोजन 6 में दिखाई देता है तो आपको जोड़ों (2,6), (3,6), और (4,6) के साथ सहसंबंध गुणांक मिल जाएगा। यह एक समस्या होगी - सभी बिंदु एक क्षैतिज रेखा पर झूठ बोलते हैं, और सहसंबंध गुणांक कुछ बहुत दिलचस्प वापस लौटाएगा। –

+0

अद्यतन: यह केवल झूठी सकारात्मक नहीं है - मेरे आंकड़े थोड़ा जंगली हैं, लेकिन मुझे लगता है कि यदि आप इसे मेरा उदाहरण डेटा देते हैं तो सहसंबंध गुणांक को शून्य त्रुटि से विभाजित करना चाहिए। यदि आप 'सीओआरआर' कुछ भी देते हैं जो वास्तव में एक संख्यात्मक उपाय नहीं है, तो आप सभी प्रकार की परेशानी के लिए पूछ रहे हैं। –

+0

[यहां] (http://en.wikipedia.org/wiki/Levels_of_measurement) मैं "संख्यात्मक माप" शब्दों के साथ क्या कहने की कोशिश कर रहा था, इसकी एक और तकनीकी चर्चा है। –

1

DBMS_FREQUENT_ITEMSET का प्रयास करें:

--Create sample data 
create table meals(meal_num number, ingredient varchar2(10)); 

insert into meals 
select 1, 'BEEF' from dual union all 
select 1, 'CHEESE' from dual union all 
select 1, 'PASTA' from dual union all 
select 2, 'CHEESE' from dual union all 
select 2, 'PASTA' from dual union all 
select 2, 'FISH' from dual union all 
select 3, 'CHEESE' from dual union all 
select 3, 'CHICKEN' from dual; 

commit; 

--Create nested table type to hold results 
CREATE OR REPLACE TYPE fi_varchar_nt AS TABLE OF VARCHAR2(10); 
/

--Find the items most frequently combined with CHEESE. 
select bt.setid, nt.column_value, support occurances_of_itemset 
    ,length, total_tranx 
from 
(
    select 
     cast(itemset as fi_varchar_nt) itemset, rownum setid 
     ,support, length, total_tranx 
    from table(dbms_frequent_itemset.fi_transactional(
     tranx_cursor => cursor(select meal_num, ingredient from meals), 
     support_threshold => 0, 
     itemset_length_min => 2, 
     itemset_length_max => 2, 
     including_items => cursor(select 'CHEESE' from dual), 
     excluding_items => null)) 
) bt, 
table(bt.itemset) nt 
where column_value <> 'CHEESE' 
order by 3 desc; 


    SETID COLUMN_VAL OCCURANCES_OF_ITEMSET  LENGTH TOTAL_TRANX 
---------- ---------- --------------------- ---------- ----------- 
     4 PASTA       2   2   3 
     3 FISH       1   2   3 
     1 BEEF       1   2   3 
     2 CHICKEN      1   2   3